JWT란? JSON 웹 토큰의 완전한 설명
빠른 답변
JWT은 점으로 구분된 세 개의 Base64URL 인코딩 부분(header.payload.signature)으로 구성된 문자열입니다. 헤더는 알고리즘을 지정하고, 페이로드에는 클레임(사용자 ID, 역할, 만료)이 포함되며, 서명은 신뢰성을 증명합니다. JWT는 상태 비저장 인증에 사용됩니다. 무료 JWT 디코더를 사용하여 브라우저의 토큰 콘텐츠를 검사하세요.
소개
JWT(JSON 웹 토큰)은 JSON 개체로 당사자 간에 정보를 안전하게 전송하기 위해 RFC 7519에서 정의한 컴팩트한 URL 안전 토큰 형식입니다. JWT는 웹 애플리케이션의 인증 및 권한 부여에 널리 사용됩니다. 사용자가 로그인한 후 서버는 클라이언트가 신원을 증명하기 위해 후속 요청에 포함하는 JWT을 발행합니다. JWT는 상태 비저장입니다. 서버는 데이터베이스에서 토큰을 조회할 필요가 없습니다. 토큰 자체에는 사용자의 주장과 변조되지 않았음을 증명하는 서명이 포함되어 있습니다.
단계별
-
세 부분으로 구성된 구조를 이해하세요.
JWT은 헤더(알고리즘 및 유형), 페이로드(클레임) 및 서명(무결성 증명)의 세 부분으로 구성됩니다. 각 부분은 Base64URL로 인코딩되며 점으로 구분됩니다(eyJhbGciOi...J9.eyJzdWIi...J9.signature). 처음 두 부분은 토큰이 있는 사람이라면 누구나 읽을 수 있습니다. 서명에만 비밀 키가 필요합니다.
-
표준 주장 알아보기
페이로드에는 주제에 대한 진술인 주장이 포함되어 있습니다. 표준 클레임: 'sub'(주체/사용자 ID), 'iat'(타임스탬프에 발급됨), 'exp'(만료), 'nbf'(이전 아님), 'iss'(발급자), 'aud'(청중). 사용자 정의 클레임에는 역할, 권한 또는 기타 데이터가 포함될 수 있습니다.
-
서명 알고리즘 이해
JWT는 대칭(HS256 — 공유 비밀) 또는 비대칭(RS256, ES256 — 공개/개인 키 쌍) 서명을 사용합니다. 서명은 변조를 방지합니다. 토큰의 일부를 변경하면 서명이 무효화됩니다. 비밀/개인 키 보유자만이 유효한 토큰을 생성할 수 있습니다.
-
인증에 JWT 사용
로그인 후 서버는 JWT을 생성하여 클라이언트에 보냅니다. 클라이언트는 후속 요청에 대한 Authorization 헤더(Bearer 토큰)에 JWT을 포함합니다. 서버는 서명을 확인하고 만료를 확인합니다. 데이터베이스 조회가 필요하지 않습니다.
예
JWT 구조
입력: 전형적인 JWT
산출: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
디코딩된 헤더
입력: 첫 번째 부분이 디코딩됨
산출: {"alg": "HS256", "typ": "JWT"}
디코딩된 페이로드
입력: 두 번째 부분이 디코딩되었습니다.
산출: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
일반적인 문제
- 디코딩 대 검증 - JWT을 디코딩(내용 읽기)한다고 해서 그것이 진짜임을 증명하는 것은 아닙니다. 클레임을 신뢰하기 전에 항상 비밀 키로 서버 측 서명을 확인하세요.
- localStorage에 JWT를 저장하면 JWT가 JavaScript에 액세스할 수 있게 되어 XSS 공격에 취약해집니다. 보안 강화를 위해 httpOnly 쿠키에 저장하세요.
- 장기 토큰 - 토큰을 도난당한 경우 만료될 때까지 유효한 상태로 유지됩니다. 긴 세션의 경우 새로 고침 토큰과 함께 단기 액세스 토큰(15~60분)을 사용하세요.
- 페이로드의 민감한 데이터 - 토큰이 있는 사람은 누구나 페이로드를 읽을 수 있습니다(암호화되지 않은 Base64). 페이로드에 비밀번호, 신용 카드 또는 비밀 정보를 넣지 마십시오.
팁
- 모든 클레임을 신뢰하기 전에 항상 서버 측 JWT 서명을 확인하십시오. 디코딩만으로는 인증이 아닙니다.
- 토큰 도난으로 인한 피해를 최소화하려면 긴 세션의 경우 새로 고침 토큰과 함께 단기 액세스 토큰(15~60분)을 사용하세요.
- XSS 공격을 방지하려면 localStorage가 아닌 httpOnly, Secure, SameSite 쿠키에 JWT를 저장하세요.
- JWT 디코더를 사용하여 디버깅을 위한 토큰 내용을 검사하세요. 토큰은 브라우저를 떠나지 않습니다.