본문 바로가기

JWT 기본구조 알아보기

@6uiw2025. 10. 29. 23:32

JWT(Jason Web Token)

  • 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰
  • URL로 이용할 수 있는 문자열로만 구성 → HTTP 구성요소 어디든 위치할 수 있음
  • 디지털 서명이 적용돼 있어 신뢰할 수 있음 

 

 


JWT의 구조

점(.)으로 구분된 아래의 세 부분으로 구성

  • 헤더(Header)
  • 내용(Payload)
  • 서명(Signature)
xxxxx . yyyyy . zzzzz
  헤더     내용       서명

 

 

📌 헤더

  • 검증과 관련된 내용
  • alg, typ 속성을 포함
  • Base64Url 형식으로 인코딩 돼 사용

 

✔️ alg

  • 해싱 알고리즘 지정 - 보통 SHA256, RSA 사용
  • 토큰을 검증할 때 사용되는 서명 부분에서 사용
{
	"alg": "H256", //HMAC SHA256 알고리즘을 사용한다는 의미 
	"typ": "JWT"
}

✔️ typ

  • 토큰의 타입 지정

 

 

 

 

 


📌 내용

  • 토큰에 담는 정보 포함 - Claim(클레임)이라고 함
    • 등록된 클레임(Registered Claims)
    • 공개 클레임(Public Claims)
    • 비공개 클레임(Private Claims)
  • 완성된 내용은 Base64Url 형식으로 인코딩

<내용 예시>

{
	"sub" : "wikibooks payload", //등록된 클레임 - 제목
	"exp" : "1602076408", // 등록된 클레임 - 만료시간
	"userId" : "wikibooks" //비공개 클레임
	"username" : "flature" //비공개 클레임
}

 

 

✔️ 등록된 클레임

  • 필수는 아니지만 토큰에 대한 정보를 담기 위해 이미 이름이 정해져 있는 클레임
클레임(Claim)  의미  설명
iss 발급자 (Issuer) JWT의 발급자를 나타내는 대소문자 구분 문자열 또는 URI
sub 제목 (Subject) JWT의 주제를 나타내며, 일반적으로 사용자 식별자 등으로 사용됨
aud 수신인 (Audience) JWT의 대상자
- 토큰을 검증하는 서비스가 자신의 식별자와 일치해야 함.
- 일치하지 않으면 JWT 거부됨
exp 만료 시간 (Expiration Time) 토큰의 유효기간을 나타내며, NumericDate(UTC timestamp) 형식으로 지정됨
nbf 사용 가능 시작 시간 (Not Before) 이 시간 이전에는 JWT가 유효하지 않음을 의미함
 iat 발급 시각 (Issued At)  JWT가 발급된 시간으로, NumericDate 형식 사용
 jti  JWT ID(식별자) (JWT Identifier) JWT의 고유 식별자.
토큰 중복 사용(재사용 공격) 방지를 위해 사용됨

 

 

✔️ 공개 클레임

  • 마음대로 정의 가능
  • IANA에 등록된 공개 클레임 목록만 사용할 수 있음

 

 

JSON Web Token (JWT)

birth_middle_name Middle name(s) someone has when they were born, or at least from the time they were a child. This term can be used by a person who changes the middle name later in life for any reason. Note that in some cultures, people can have multiple

www.iana.org

 

✔️비공개 클레임

  • 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임

 

 

 

 

 

 


📌 서명

  • 인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성됨
  • 토큰의 값들을 포함해서 암호화하기 때문에 메시지가 도중에 변경되지 않았는지 확인할 때 사용됨

ex) HMAC SHA256 알고리즘을 사용한 서명 생성

HMACSHA256(
	base64UrlEncode(header) + "." +
	base64UrlEncode(payload),
	secret	
)
6uiw
@6uiw :: LOG.INFO("MING's DEVLOG")

개발을 하면서 공부한 기록을 남깁니다

목차