JWT(JSON Web Token)는 개방형 표준(RFC 7519)으로, 당사자 간에 정보를 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의합니다. 이 정보는 디지털 서명되었기 때문에 검증되고 신뢰할 수 있습니다.
JWT는 점(.)으로 구분된 세 부분으로 구성됩니다: 헤더(Header), 페이로드(Payload), 서명(Signature). 헤더는 서명 알고리즘을 지정하고, 페이로드는 클레임을 포함하며, 서명은 메시지가 변조되지 않았음을 검증하는 데 사용됩니다.
인증(가장 일반적인 시나리오), 정보 교환(JWT는 서명될 수 있으므로 안전하게 정보를 전송할 수 있음), 권한 부여(사용자 권한 정보 포함) 및 단일 사인온 구현.
JWT는 여러 서명 알고리즘을 지원하며, 주로 두 가지 유형으로 나뉩니다: HMAC 기반의 대칭 알고리즘(예: HS256)과 RSA/ECDSA 기반의 비대칭 알고리즘(예: RS256, ES256). 대칭 알고리즘은 동일한 키로 서명하고 검증하며, 비대칭 알고리즘은 개인 키로 서명하고 공개 키로 검증합니다.
JWT에 민감한 정보(예: 비밀번호)를 저장하지 마세요. JWT의 페이로드 부분은 Base64로 인코딩된 것이지 암호화된 것이 아닙니다. 높은 보안이 필요한 애플리케이션의 경우, 짧은 만료 시간을 사용하고 토큰 순환 전략을 구현하는 것이 좋습니다.
JWT가 만료되면 서버는 이 토큰을 거부합니다. 권장되는 처리 방법은 리프레시 토큰(Refresh Token) 메커니즘을 구현하는 것입니다. 클라이언트는 리프레시 토큰을 사용하여 새로운 액세스 토큰을 얻을 수 있으며, 사용자가 다시 로그인할 필요가 없습니다. 리프레시 토큰은 일반적으로 더 긴 유효 기간을 가지지만, 신중하게 저장해야 합니다.
엄밀히 말하면, JWT는 상태를 유지하지 않는 토큰으로 설계되었으며, 실제로 취소할 수 없습니다. 그러나 몇 가지 일반적인 해결책이 있습니다: 취소된 토큰의 블랙리스트를 유지(JWT의 상태를 유지하지 않는 이점을 상쇄할 수 있음), 짧은 만료 시간과 리프레시 토큰을 함께 사용, 또는 토큰에 버전 식별자를 포함시켜 서버가 이전 버전을 거부할 수 있도록 합니다.
JWT는 모든 필요한 정보를 포함하는 자체 포함된 토큰으로, 분산 시스템에 적합하며 서버에 세션 상태를 저장할 필요가 없습니다. 세션은 서버 측 저장을 기반으로 하며, 세션 상태를 유지해야 하므로 단일 서버 아키텍처에 더 적합합니다. JWT는 확장성이 더 좋지만, 취소가 복잡합니다; 세션은 취소가 쉽지만 확장성이 떨어집니다.