주말동안 공부한 내용을 토대로 작성해보는....
5가지 질문으로 알아보는 Json Web Token (이하: JWT) 🧵
(반말 주의!)
Q1: JWT가 뭐야?
JWT는 두 개체가 정보 조각들("claims")을 안전하게 통신하기 위해 만들어진 개방형 표준 (datatracker.ietf.org/doc/html/rfc7519) 이야.
JWT에는 3가지 정보가 담겨있어
1. 머리말 (이 토큰을 인증하는 방법)
2. 정보 조각 (JSON으로 쓴다!)
3. 인증 (이 토큰이 날조되지 않았다는 증거)
Q2: JWT는 어떻게 쓰여지고 있어?
무상태 세션을 구현할 때 많이 쓰여. 일반적인 세션 구현은 DB에 상태 저장이 필요하지만, JWT는 토큰에 모든 정보를 담아, DB 조회가 필요가 없지!
Q3: 보안 전문가들이 JWT를 쓰지 말라고 하던데?
JWT 표준은 보안 표준으론 질 떨어진다는 의견이야. 몇 가지 이유를 보면:
1) JWT 머리말에 토큰 인증 방법 중 하나가 none"인데, 인증하지 않는 방법이 인증 방법이라는 게 어처구니없지. 실제 이를 악용한 공격도 있어.
3) 인증된 토큰을 쉽게 차단할 방법이 없어. 토큰이 탈취된 걸 알아도, 인증이 만료가 될 때까지 기다리거나, DB에 차단된 토큰 리스트를 저장해야 하는데... 후자를 채택하면 결국 "무상태 세션"이 아니게 되니 JWT의 메리트가 떨어지지.
결론: JWT는 날카로운 칼 같아서 쉽게 베이는데, 사용자 인증처럼 중요한 과정에 쓰이는게 불편하다!
가 보안 전문가들의 의견이야.
대부분 전문가들은 사용자 세션은 framework에 내장된 상태 세션 라이브러리를 사용하는걸 권장해.
상태 세션으로 인해 DB 부하가 걱정될 정도로 커져서 무상태 세션이 매력적으로 보인다면, 보안 전문가와 함께 무상태 세션 구현에 도전하도록 하고.
Q4: 그럼 JWT는 절대 쓰면 안돼?
그건 아냐! 소셜 로그인의 기반이 되는 OpenID Connect 규격은 ("Google 계정으로 로그인" 그거) JWT로 계정 정보를 통신하도록 명시돼있어.
언어/프레임워크에 귀속되지 않은 개방형 표준이 별로 없긴해. 그중 JWT가 그나마 제일 지원이 잘 되는 편이지.