JWT 구조: 헤더, 페이로드, 서명
base64url 부분을 디코딩하고 각 JWT 필드를 이해합니다.
JWT 구조: 헤더, 페이로드, 서명은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
JWT란 무엇입니까?
JSON 웹 토큰(JWT)은 RFC 7519에 정의된 간결하고 URL에 안전한 토큰 형식입니다. 클레임(주체에 대한 주장)과 암호화 서명을 하나의 문자열로 인코딩해 상태 비저장 인증을 가능하게 합니다.
세 부분 구조
JWT의 형식은 다음과 같습니다: base64url(header).base64url(payload).base64url(signature). 점이 각 부분을 구분합니다. 헤더와 페이로드는 읽을 수 있으며(base64url로 인코딩되었을 뿐 암호화되지 않음), 암호화된 부분은 서명뿐입니다.
헤더
헤더는 JSON 객체입니다: {"alg":"HS256","typ":"JWT"}. alg는 서명 알고리즘(HS256, RS256, ES256, none)을 지정합니다. typ는 항상 "JWT"입니다. 추가 헤더에는 키 선택을 위한 kid(키 ID)가 포함됩니다.
페이로드 / 클레임
표준 등록 클레임은 다음과 같습니다. iss(발급자), sub(주체), aud(대상), exp(만료 Unix 타임스탬프), nbf(이전에는 유효하지 않음), iat(발급 시각), jti(폐기를 위한 JWT ID)입니다. 사용자 지정 클레임은 추가되는 모든 키-값 쌍을 의미합니다.
JWT 디코딩
import base64, json token = "eyJ..." parts = token.split(".") header = json.loads(base64.urlsafe_b64decode(parts[0]+"==")) payload = json.loads(base64.urlsafe_b64decode(parts[1]+"==")) print(header, payload)
서명 검증
HS256의 경우: HMAC-SHA256(base64url(header)+"."+base64url(payload), secret)입니다. 수신자는 이를 다시 계산해 서명 부분과 비교합니다. 두 값이 일치하고 토큰이 만료되지 않았다면 토큰은 유효합니다.
비대칭 서명
RS256의 경우 개인 키가 RSA-SHA256을 사용해 header.payload 문자열에 서명합니다. 공개 키를 가진 모든 주체가 개인 키 없이 서명을 검증할 수 있습니다. 공개 키는 JWKS(JSON Web Key Set) 엔드포인트를 통해 배포됩니다(예: /.well-known/jwks.json).
Base64url 인코딩
Base64url은 +를 -로, /를 _로 바꾸고 = 패딩을 생략합니다. 따라서 퍼센트 인코딩 없이도 JWT를 URL, HTTP 헤더 및 쿠키에서 안전하게 사용할 수 있습니다. 원시 바이트는 여전히 암호화되지 않고 단지 인코딩되었을 뿐입니다.
JWT는 기본적으로 암호화되지 않습니다
JWT 페이로드는 base64url로 디코딩할 수 있는 사람이라면 누구나 볼 수 있습니다. 실제 암호화를 위해 "enc" 알고리즘과 함께 JWE(JSON Web Encryption)를 사용하는 경우가 아니라면 JWT 페이로드에 비밀 정보(비밀번호, 주민등록번호)를 절대 넣지 마십시오.
토큰 유효 기간
exp를 짧은 기간으로 설정하십시오(액세스 토큰은 15~60분). 수명이 긴 JWT는 위험이 누적되므로 탈취되면 만료될 때까지 유효합니다. 안전하게 저장한 갱신 토큰을 사용해 수명이 짧은 새 액세스 토큰을 발급하십시오.
JWKS 검색
인증 제공업체(Auth0, Keycloak, Google)는 JWKS URL을 게시합니다. 검증자는 kid를 기준으로 공개 키를 가져와 캐시하고, 요청마다 발급자에게 연락하지 않고 서명을 검증합니다. 키를 교체하면 JWKS 엔드포인트가 업데이트됩니다.
빠른 확인
JWT에서 암호화 서명이 포함된 부분은 어디입니까?
복습
JWT는 base64url로 인코딩된 세 개의 JSON 부분인 헤더(알고리즘), 페이로드(클레임), 서명으로 구성됩니다. 페이로드는 읽을 수 있으며 암호화되지 않습니다. 다음으로는 HS256과 RS256 중 선택하는 방법을 살펴봅니다.
자주 묻는 질문
“JWT 구조: 헤더, 페이로드, 서명” 강의는 무료인가요?
네 — “JWT 구조: 헤더, 페이로드, 서명” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“JWT 구조: 헤더, 페이로드, 서명”에서 뭘 배우나요?
base64url 부분을 디코딩하고 각 JWT 필드를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“JWT 구조: 헤더, 페이로드, 서명” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- JWT 구조: 헤더, 페이로드, 서명
- HS256과 RS256: 대칭 및 비대칭 JWT
- JWT 취약점: alg=none 및 키 혼동
- 안전한 JWT 구현 모범 사례