KDT 최종 프로젝트를 진행할 때 회원 인증에 대해서 피드백을 받았을 때,
어째서 리프레시 토큰을 쿠키에 저장하는지, 액세스 토큰을 발급할 때마다 새로운 리프레시 토큰을 생성하는지에 대해서 멘토님께 설명드리지 못했습니다.
그 때의 아쉬움이 남아서 같은 상황이 생기면 더 좋은 답변을 할 수 있도록 글을 작성했습니다.
1. 리프레시 토큰을 사용하는 이유
만약에 직원이 출입증을 잃어버렸다면 다음 절차가 이루어질 것입니다.
먼저, 출입증을 재발급하고 기존에 사용하던 출입증은 정지해야 합니다.
데이터베이스에 정지할 토큰을 기록하는 방법이 있지만, 이는 JWT의 이점을 흐리게 만듭니다.
그래서 일반적으로 토큰의 유효기간을 짧게 설정하여 탈취당하더라도 공격자가 이용할 수 있는 시간을 제한합니다.하지만, 유효기간이 짧은 액세스 토큰만 사용한다면 사용자는 로그인을 계속 다시하는 불편한 경험을 하게 됩니다.
이를 보완하기 위해서 리프레시 토큰을 도입할 수 있습니다.
리프레시 토큰은 상대적으로 긴 유효기간을 가지고 있고, 안전한 장소에 보관하여 보안성을 높입니다.
2. 간편한 쿠키, 보안에도 안전?
토큰을 쿠키에다 저장하면 클라이언트 측에서 개발할 때 저장 방식을 고민하지 않아도 됩니다.
쿠키에 저장하면 여러 탭을 사용할 때도 유지되고 새로고침을 해도 유지됩니다.
하지만, 쿠키에 아무런 설정을 하지 않으면 보안에 취약할 수 있습니다.
쿠키에 대한 보안을 강화하려면 어떻게 하는 것이 좋을까요?
MITM 공격을 하면 사용자가 HTTP로 로그인을 할 때 네트워크 트래픽을 가로채서 쿠키를 탈취할 수 있습니다.
이를 방지하려면 쿠키에 Secure 옵션을 적용해서 HTTPS 환경에서만 전송하도록 해야 합니다.
XSS 취약점이 있는 웹사이트는 document.cookie로 사용자의 쿠키를 탈취하려는 시도가 있을 수 있습니다.
HttpOnly 옵션이 설정되었다면 만에 하나 시도하더라도 자바스크립트로 접근할 수 없기 때문에 안전합니다.
CSRF 공격은 사용자가 인증된 세션이나 토큰을 가진 상태에서 공격자의 사이트가 사용자를 속여 원치 않는 요청을 서버로 보내는 것을 의미합니다.
예를 들어, 사용자가 이커머스 웹 사이트에 로그인을 한 상태로 공격자의 악성 사이트에 접속하면,
공격자의 사이트는 자동으로 이커머스 웹 사이트에 결제 요청을 보내고 사용자는 모르는 사이에 카드 결제가 수행될 수 있습니다.
브라우저는 같은 사이트의 쿠키를 자동으로 포함하기 때문에 생기는 문제점이며, 이를 해결하려면 SameSite 옵션을 적용해야 합니다.
3. 리프레시 토큰 로테이션
아무리 보안을 강화했어도 리프레시 토큰이 탈취당할 수 있습니다.
문제는 리프레시 토큰은 기간이 길기 때문에 공격자는 장기적으로 악용할 수 있습니다.
이에 대한 해결책으로는 새로운 액세스 토큰과 함께 리프레시 토큰을 발급하는 방법이 있습니다.
새로운 토큰을 발급할 때 기존의 토큰을 즉시 폐기하면 공격자의 리플레이 공격 또한 방지할 수 있습니다.
글을 끝까지 읽어주셔서 감사합니다.
틀린 내용이 있다면 댓글로 지적 부탁드립니다.
'프로젝트' 카테고리의 다른 글
[WebRTC] 이용하기 쉬운 화상 채팅 경험 제공하기 (0) | 2025.02.11 |
---|---|
[CORS] 내 요청은 왜 차단될까? (0) | 2024.12.24 |
[What To Do] JWT 인가 미들웨어 제작하기 (0) | 2024.10.16 |
[서점 프로젝트] SQL Error [1701] 해결하기 (1) | 2024.10.15 |
[서점 프로젝트] 서브 쿼리를 이용한 평점 업데이트 (1) | 2024.10.08 |