JWT는 과연 좋은가?
업데이트:
결론부터 말하자면 제한적인 비즈니스 요구사항에서만 유용할 것이라고 생각한다.
개요
내가 많은 프로젝트를 해본건 아니지만, 경험적으로 최근 웹 서비스들의 인증 처리에 JWT를 사용하는 경우가 많은 것 같다.
핫한 기술이기에 공부하고 프로젝트에 적용도 해보았는데 알수록 제한적으로만 유용하고, 특히 주니어(나같은 사람들..)들이 기술의 장/단을 잘 모르고 사용하는 것 같아 확실하게 짚고 넘어가고 싶었다.
scalable한 인프라에서..
JWT의 가장 큰 장점은 무상태성에 있다.
JWT는 토큰을 signing하기 위한 암호키
만으로 해당 인증정보의 유효성을 검증할 수 있다.
세션의 경우 그 특징에 따라 메모리나 외부 DB에 세션 키를 저장해야만 하기 때문에, 세션 키를 가진 특정 서버에 인증이 종속되는 문제(stateful)가 있다.
왜 stateful한 것이 문제이나 하면 다중화된 애플리케이션
환경에서는 모든 애플리케이션에서 같은 데이터를 바라보아야만 하기에, 중앙 집중화된 어떤 서버에 세션 키가 관리되어야만 하는 문제가 생기게 된다.
JWT는 암호키만으로 유효성 검증이 가능하기에 이런 문제에서 자유로워질 수 있다.
그럼 좋은거 아냐?
그럼 해피한거 아니냐? 싶을 수 있는데 문제는 비즈니스 요구사항에서 발생한다.
서비스 중 악성 사용자( e.g. 해커, 스팸 유저… )를 Ban해야 한다는 비즈니스 요구사항은 흔한 편이다. (그렇지 않은가?)
이 요구사항을 구현하기 위해 일반적으로 AccessToken과 RefreshToken을 두고, RefreshToken을 인메모리던 RDB던 어딘가에 저장한 후에 필요할 때 조회하여 무효화 처리한다.
인증 과정 중에 ‘저장 및 조회’ 프로세스가 생기는 경우 이제 당신의 인증 과정은 Stateful해졌다.
이 경우 위에 설명한 세션과 동일하게 중앙 집중형 캐시 서버가 필요해진다.
물론 세션과의 차이는 있다.
Access+Refresh 조합으로 구현한 인증에서 AccessToken을 어딘가에 저장하지 않기에, AccessToken이 유효한 동안은 외부 캐싱 서버에 네트워크 I/O 하지않는 강점이 있다.
이 경우 매번 네트워크 I/O가 필요한 세션에 비해 Access + Refresh의 조합의 인증이 비용이 적을 가능성이 높아보인다.
monolithic 인프라에서..
무상태성이 왜필요해?
다중화를 고려하지 않는 모놀리식 애플리케이션에서는 무상태성을 가질 필요가 없다. (어차피 요청을 하나의 서버로만 받을거니까..)
이 땐 메모리만 충분하다면 세션 키를 메모리에 저장하고 O(1)로 가져오는 세션 방식이, 디코딩과 검증 프로세스가 있는 JWT에 비해 비용 상 저렴할 것이다.
마무리
JWT를 욕하고 싶은 홍대병이 있어서 안좋은 점을 가득 써봤는데요.
JWT는 프로토콜 그 자체에 Payload를 가졌다는 강점도 가지고 있습니다. (물론 세션도 비슷하게 구현할 수 있겠지만요)
다른 생각을 가진 분들의 의견을 듣고 싶습니다.
읽으면서 이 부분은 아니다! 라는 생각을 가지셨다면 댓글으로 의견 공유 부탁드리겠습니다.
감사합니다.
댓글남기기