JSON Web Token(JWT)은 웹 표준으로 정의된 JSON 기반의 토큰입니다.
JWT는 인증이나 권한 부여에 사용되며, 토큰 자체가 필요한 모든 정보를 포함합니다. 토큰은 서명되어 있어 변조가 불가능하며, 서명을 통해 유효성 검증이 가능합니다.
JWT는 세 부분으로 구성됩니다. 첫 번째는 Header로서, 토큰의 타입과 사용하는 암호화 알고리즘에 대한 정보가 담겨 있습니다. 두 번째는 Payload로서, 토큰에 담길 클레임(claim) 정보가 포함됩니다. 클레임은 사용자 정보나 권한 등을 포함할 수 있으며, 등록된 클레임(registered claim), 공개 클레임(public claim), 비공개 클레임(private claim)으로 나뉩니다. 세 번째는 Signature로서, Header와 Payload를 인코딩한 후, 서버에서 발급된 비밀키를 사용하여 인증 정보를 포함한 서명이 포함됩니다.
JWT는 토큰 자체가 필요한 모든 정보를 포함하고 있어, 토큰을 검증하고 유저 정보를 추출하는 작업이 쉽고 효율적입니다. 또한, 토큰이 서명되어 있기 때문에, 토큰 자체가 변조되었는지 확인 가능합니다. 이러한 특징으로 JWT는 인증 및 권한 부여에 자주 사용되며, OAuth2.0 등의 프로토콜에서도 사용됩니다.
JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA
HHHHHH-PPPPPP-SSSSSS
클라이언트가 서버에 로그인 요청을 보냈을 때 인증이 완료되면서 서버는 JWT를 생성합니다.
JWT는
header-payload-{ HMAC으로 암호화한 Signature (header+payload+secret Key) }
를 각 Base64로 인코딩하여 클라이언트에게 돌려줍니다.
로그인이 완료된 클라이언트가 서버에 개인정보를 확인할 수 있는 마이페이지를 요청할 때
HTTP 요청 헤더인 Authorization 필드에 JWT를 담아서 서버에 보냅니다.
JWT를 받은 서버는 Signature를 통해 토큰이 변조되지 않았는지 확인하고 신뢰할 수 있는 토큰인지 판단합니다.
서버는 JWT를 받은 후, Header와 Payload를 다시 Base64Url 디코딩하여 Signature를 검증하고, Signature가 일치한다면 해당 토큰을 신뢰할 수 있는 토큰으로 간주합니다.