최근 면접 질문으로 JWT의 무상태성에 대해서 듣게 되었다.
내 옆의 지원자 분께서 받은 질문인데
"JWT가 stateless해서 좋다면 session보다 무조건 JWT를 쓰면 좋겠네요?" 라는 질문을 하셨다.
물론 stateless하다는 점에서 서버 부하가 줄어들기 때문에 좋은건 맞다고 생각한다. 하지만 access token과 refresh token을 같이 쓴다면 refresh token을 서버에서 관리해야 하기 때문에 (정확히는 서버쪽 디비) 완전히 stateless하지는 않다고 생각한다.
또한 jwt token 자체를 탈취당한다면 서버 입장에서는 탈취 유무를 모르기 때문에 쉽게 악용 가능하다.(물론 탈취하는거 자체는 어려울 것이다.)
이때 이 탈취에 대한 대비책으로 RTR(Refresh Token Rotate) 방식을 사용할 수 있다.
RTR 방식은 refresh token 자체를 1번만 사용할 수 있게 처리하는 것이고 한번 처리한 토큰은 블랙리스트로 등록하는 방법이다.
블랙리스트로 등록하게 된다면 refresh token이 탈취당하더라도 탈취된 토큰임을 알 수 있기 때문에 탈취 예방에 효과적이다.
하지만 여기서 의문이 생겼다. access token이 탈취당하면 계속해서 사용할 수 있는게 아닌가?
결론적으로는 맞다. 계속해서 사용할 수 있다. 하지만 jwt는 access와 refresh 2개로 구분되고 access token은 기본적으로 유효기간을 짧게 설정하기 때문에 얼마 지나지 않아 만료될 것이다. 이때 access token만 탈취했다면 refresh token이 없기 때문에 다시 사용을 못하게된다.
그런데 RTR 방식을 쓰면 결국 refresh token과 access token의 시간이 똑같아지는 것 처럼 동작하는게 아닌가? 라는 생각이 들었다. access token이 만료될 때마다 블랙리스트의 refresh token을 매번 조회해야하고 이렇게 된다면 refresh token과 access token의 수명이 똑같아지는 문제가 생기고 refresh token의 역할(access token보다 긴 유효시간을 통한 재발급)이 무의미해진다고 생각했다.
하지만 요청마다 db 부하가 생기는 session 방식과는 달리 access token의 유효시간 동안은 db 부하가 적기 때문에 db 부하 측면과 백엔드 서버에 생기는 부하 측면에서는 jwt 토큰이 더 유리하다고 생각한다.
또한 RTR을 화이트리스트 형태로 처리할 수 있다.
기본적으로 현재 접속중인 refresh token을 레디스에 등록하고 현재 접속중인 사용자가 어떤 refresh token을 가지고 있는지를 확인하는 것이다. 블랙리스트는 refresh token이 레디스에 있다면 사용 못하게 하는 것이고 화이트리스트는 refresh token이 레디스에 있다면 사용할 수 있게 처리하는 것이다.
화이트리스트는 블랙리스트에 비해 더 적은 용량을 처리한다는 장점이 있다.
현대 애플리케이션은 엄청나게 많은 트래픽을 감당해야하고 트래픽을 처리하기 위해 scale up 방식은 한계가 명확하기에 scale out 방식이 효과적이라 생각한다. 이때 여러개의 서버가 공존하기 때문에 stateless하면 할수록 유리한 분산 처리에 유리한 구조라고 생각한다. 하지만 session 방식, jwt 방식 모두 조금이라도 stateful하게 처리된다. 즉, 완벽한 보안을 유지하면서 완벽한 stateless를 할 수 있는 방법은 없다. 각자 맡은 서비스의 특징을 잘 살펴보고 장단점을 잘 고려해서 어떤 방식을 쓸지를 결정하면 좋을 것 같다.
참고하면 좋은 글
1. https://alstn113.tistory.com/56
'일기' 카테고리의 다른 글
| [개발일기] Real MySQL 1권 (0) | 2025.10.23 |
|---|---|
| [개발일기] MongoDB Sharding with mongos, config (0) | 2025.10.08 |
| [개발일기] - 파티셔닝과 샤딩 (1) | 2025.10.05 |
| [개발일기] - 인덱스에 대해서 자세히 알아보기 (0) | 2025.10.01 |
| [개발일기] 09.19 - 데이터베이스란 무엇인가? (0) | 2025.09.19 |