토큰 보안 이슈
처음에 유저가 로그인 시 서버에서 accessToken과 refreshToken을 생성해서
aceessToken은 json 형식으로, refreshToken은 쿠키에 담아서 보내려고 했다.
const refreshToken = jwt.sign({ userId: 'user123' }, 'refresh_token_secret');
const accessToken = jwt.sign({ userId: 'user123' }, 'access_token_secret');
// 리프레시 토큰을 쿠키에 담아 클라이언트로 전송
res.cookie('refreshToken', refreshToken )
// 엑세스 토큰을 JSON으로 응답
res.json({ accessToken });
→ aceessToken을 그냥 json으로 보내는 것은 네트워크 트래픽에 노출되기 때문에
CSRF(Cross-Site Request Forgery)와 같은 공격에 취약할수 있어,
악의적인 공격자가 JSON을 가로챌 수도 있다.
const refreshToken = jwt.sign({ userId: 'user123' }, 'refresh_token_secret');
const accessToken = jwt.sign({ userId: 'user123' }, 'access_token_secret');
res.cookie('token', { refreshToken, accessToken }, { httpOnly: true });
→ 따라서 두개의 토큰 전부 쿠키에 담아서 보냈다.
그리고 HTTP only 플래그를 설정해줘서 브라우저에서 쿠키에 접근하는 것을 막아주었다.
쿠키가 자바스크립트 코드로부터 만약 접근이 가능하다면,
XSS 공격자는 토큰을 탈취할 수 있기 때문이다. 마찬가지로 CSRF 공격도 방지하기 위함이다.
한마디로 말해서 쿠키를 노출시키지 않기 위해서 (접근하지 못하게 하기 위해서)
HTTP only를 켜주었다. 그리고 SSL/TLS 인증서를 사용하여 암호화 프로토콜을 추가하고
secure 플래그도 활성화시킴으로써 보안을 더 강화하였다.
728x90
'개발 > 프로젝트' 카테고리의 다른 글
| [세션 / 토큰 로그인 프로젝트] 구성 및 개요 (0) | 2023.07.06 |
|---|---|
| [엘리스트랙 SW 4기 | 2차 프로젝트 복기] 소통왕 프로젝트 / 별도의 docs를 작성하여 jsdoc 주석 적용 (0) | 2023.07.02 |
| [엘리스트랙 SW 4기 | 2차 프로젝트 복기] 소통방법 구체화하기 | 데이터 모델링 / 시퀀스 다이어그램(1) (0) | 2023.07.01 |
| [엘리스트랙 SW 4기 | 2차 프로젝트] 트러블슈팅 - 미들웨어(multer 이미지 업로드 관련 이슈) (0) | 2023.06.09 |
| API 명세서 초안 (0) | 2023.04.18 |