로그인 후 서버는 어떻게 사용자를 인식하나요? 현대 웹 앱은 JWT로 신원 정보를 전달합니다. JWT의 구조와 원리를 이해하면 인증 시스템 개발과 디버깅에 도움이 됩니다. 이 튜토리얼은 JWT를 쉽게 이해하도록 돕습니다.
JWT란 무엇인가
JWT는 JSON Web Token의 약자로, 여러 당사자 간에 정보를 안전하게 전달하는 간결한 토큰 형식입니다. 주요 용도는 신원 인증으로, 사용자가 로그인하면 서버가 JWT를 발급하고, 클라이언트는 이후 모든 요청에서 이를 사용하여 신원을 증명합니다.
3단 구조
JWT는 세 부분으로 구성되며, 점으로 연결됩니다: Header(헤더), Payload(페이로드), Signature(서명), 형태는 xxxxx.yyyyy.zzzzz입니다.
Header는 토큰 유형과 서명 알고리즘을 설명합니다; Payload는 claims(클레임)을 저장하며, 사용자 ID, 발급 시간 iat, 만료 시간 exp 등을 포함합니다; Signature는 비밀키를 사용하여 앞의 두 부분에 서명하여 변조를 방지합니다.
Payload는 암호화되지 않습니다
주요 오해: Header와 Payload는 Base64Url로 인코딩될 뿐 암호화되지 않습니다. 누구나 JWT를 가져가면 Payload의 내용을 디코딩하여 볼 수 있습니다.
따라서 Payload에 비밀번호, 신용카드 번호 등 민감한 정보를 절대 저장하면 안 됩니다. 서명은 내용이 변조되지 않았음을 보장할 뿐, 내용의 비밀성을 보장하지는 않습니다.
서명은 어떻게 변조를 방지하나
서명은 서버가 보유한 비밀키를 사용하여 Header와 Payload를 계산하여 생성됩니다. 만약 Payload를 변경하면(예: 사용자 ID를 다른 것으로 변경), 재계산된 서명이 일치하지 않아 서버는 토큰을 유효하지 않다고 판단합니다.
서명 검증에 비밀키가 필요하기 때문에, 순수 클라이언트 도구는 「디코딩하여 볼 수만」 있고 「서명을 검증할 수는」 없습니다. 이는 정상적이고 안전한 설계입니다.
JWT 디버깅의 실용적인 방법
디버깅 시에는 JWT에 무엇이 들어있는지 자주 확인해야 합니다. qktools의 JWT 분석 도구를 사용하면, 토큰을 붙여넣기만 하면 로컬에서 Header와 Payload를 디코딩할 수 있으며, 만료 시간을 자동으로 읽기 쉬운 시간으로 변환하고 만료 여부를 표시합니다. 토큰은 업로드되지 않습니다.
Base64Url 인코딩을 더 이해하고 싶다면, Base64에 대한 우리 기사를 읽거나 Base64 인코딩/디코딩 도구를 사용해 보세요.

