세션과 JWT
10/26/2024
이 글은 세션과 JWT(JSON Web Token)의 정의를 설명하기보다는, 두 방식을 새로운 관점에서 살펴보고 논의하고자 한다. 다만, 여기서 제시하는 모든 내용은 개인적인 견해이며 오류가 있을 수 있음을 미리 밝혀둔다.
인식
인터넷을 살펴보면 흥미로운 의견들을 접할 수 있다. 일부는 JWT 리프레시 토큰 사용이 세션 방식과 크게 다르지 않다고 주장한다. 또는, 세션 방식을 구식 기술로 여기는 사람들도 종종 있다.
목적성
요즘 세션은 웹 애플리케이션 내 메모리가 아닌 레디스나 데이터베이스에 저장하는 방식을 주로 택한다. 이 경우, 상황에 따라 네트워크 비용이 발생할 수 있다. 예를 들어, 세션 저장소가 API 서버와 물리적으로 분리되어 있을 때가 그렇다.
반면 JWT는 토큰 방식이기 때문에, 서버는 사용자로부터 받은 토큰을 즉시 검증할 수 있어 네트워크 연결로 인한 시간을 절약할 수 있다. 이러한 이점을 위해서, 혹은 세션 저장소의 관리 비용 부담을 줄이기 위해 JWT를 고려할 수 있다.
세션에 대해서는 이미 잘 알고 있다고 가정하고, JWT에 대해 좀 더 말해보자면.
액세스 토큰
사용자는 액세스 토큰을 서버 요청에 포함하여 전송한다. 이 방식은 유효한 액세스 토큰만으로 모든 요청을 허용하기 때문에 몇 가지 문제를 야기할 수 있다. 예를 들어, 유효 기간이 하루인 액세스 토큰이 발급된 지 한 시간도 되지 않아 사용자가 로그아웃하는 경우, 이미 발급된 토큰을 무효화하는 것이 적절할 수 있다.
그러나 API 서버에서 매번 화이트리스트 등을 이용해 토큰의 유효성을 확인한다면, 이는 사실상 세션 방식과 다를 바가 없어진다. 아마도 이런 부분에서 많은 사람들이 혼란을 겪었을 것이다.
리프레쉬 토큰
액세스 토큰만을 이용한 방식은 토큰이 탈취될 경우 대응이 어렵다는 한계가 있다. 이를 보완하기 위해 대부분의 경우 리프레시 토큰을 사용하여 액세스 토큰을 자주 갱신하는 방식을 채택한다. 예를 들어, 액세스 토큰의 유효 기간을 하루가 아닌 1분으로 설정해보자. 이 경우 클라이언트는 1분마다 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받는다.
이 방식의 장점을 살펴보면 다음과 같다. 서버는 세션 방식과 유사하게 화이트리스트같은 걸 만들어 오직 유효한 리프레시 토큰만을 기록하고 있을 수 있다. 사용자가 로그아웃하게 되면 기존 리프레쉬 토큰은 무효화되고 이로 인해 사용자는 새로운 액세스 토큰을 발급받지 못하게 된다. 다만, 기존 액세스 토큰은 여전히 유효하지만, 그 유효 기간은 최대 1분에 불과하다.
리소스 관점에서 보면, 액세스 토큰을 재발급할 때만 화이트리스트를 확인하면 되므로 1분 동안은 세션 저장소에 여유가 생긴다.
시소
마치 시소같다. 액세스 토큰의 유효 기간을 매우 짧게 설정하면 세션 관리 부담은 줄어들지만, 그 짧은 시간 동안 토큰이 여전히 유효하다. 반면, 유효 기간을 한 시간으로 설정하면 그 동안 보안 취약성이 존재한다. 결국, 이 액세스 토큰의 유효 기간을 적절히 설정해야 보안과 효율성이라는 두 마리 토끼를 모두 잡을 수 있다.
결론
이 글에서는 세션과 JWT의 사용 목적에 대한 간단한 차이점과 JWT 사용 시 발생할 수 있는 문제점을 논의했다. 그러나 보안성 측면에서는 더 깊이 있게 다뤄야 할 부분이 남아 있다. 이에 대해 추가로 언급하고 싶은 점이 있으나, 현재로서는 충분한 지식이 부족하여 확신을 갖고 말하기 어렵다. 이 주제에 대해 더 깊이 공부한 후, 다음 기회에 자세히 다루어보고자 한다.