JWT는 온라인 네트워크에서 정보를 안전하게 통신할 때 사용하는 인터넷 표준 토큰입니다.
JWT는 모든 필수 정보를 자체적으로 담고 있어 서버에서 데이터베이스 조회 없이 토큰만으로 사용자 인증 및 권한 확인이 가능합니다. 또한 무상태 구조를 지향하며 서버 측의 부담을 줄일 수 있습니다. 또한 HTTP 헤더나 URL 파라미터로 전달할 수 있기에 분산환경에서 확장과 전달이 용이하다는 장점이 있습니다.
JWT는 어떤 구조로 이루어져 있나요?
JWT는 점(
.)으로 구분된 Header, Payload, Signature 세 부분으로 구성됩니다. Header에는 토큰 유형과 서명 알고리즘, Payload에는 사용자 식별자나 권한·만료 시간 같은 Claim, Signature에는 Header와 Payload를 비밀 키 또는 개인 키로 서명한 값이 들어갑니다.
JWT의 Payload에 비밀번호 같은 민감 정보를 넣어도 되나요?
안 됩니다. 일반적인 JWT의 Header와 Payload는 암호화된 것이 아니라 Base64URL로 인코딩된 것이므로 누구나 디코딩하여 읽을 수 있습니다. 서명은 위변조 여부를 검증할 뿐 기밀성을 제공하지 않으므로 민감 정보는 넣지 않아야 하며, 암호화가 필요하다면 JWE 같은 별도의 방식을 고려해야 합니다.
JWT를 검증할 때 서명 외에 무엇을 확인해야 하나요?
서버가 허용한 알고리즘으로 서명이 유효한지 확인한 뒤
exp와nbf같은 시간 Claim, 발급자iss, 대상자aud등을 서비스 정책에 맞게 검증해야 합니다. 토큰이 서명되었다는 사실만으로 현재 요청에서 사용 가능한 토큰이라고 볼 수는 없습니다.