본문 바로가기
-

JWT에 대해서 (구성 요소, 인증 절차 등)

by dong_su 2023. 12. 12.

JWT(JSON Web Tokens)란?

  • 두 개체에서 JSON 객체를 사용하여 가볍고 정보를 안전성 있게 전달하는 방식

 

JWT의 구성 요소

  • Header
  • Payload(Claim)
  • Signature

 

Header

{
  "alg": "HS256",   // 사용된 해싱 알고리즘
  "typ": "JWT"      // 토큰의 유형
}

 

Payload(Claim)

{
  "sub": "1234567890",   // subject, 토큰의 주제 (일반적으로 사용자 ID)
  "name": "John Doe",    // 사용자 이름
  "admin": true,         // 관리자 여부
  "iat": 1516239022      // 토큰 발급 시간 (issued at)
}

-> Payload(Claim)은 주로 세 가지 종류의 클레임으로 나뉜다.

 

Registered Claims (등록된 클레임):

  • 토큰에 대한 정보를 나타냅니다. 이는 표준화된 클레임으로, 일반적인 정보를 제공합니다.
  • sub: 토큰의 주제 (일반적으로 사용자 ID)
  • iss: 토큰을 발급한 발급자 (issuer)
  • iat: 토큰 발급 시간 (issued at)
  • exp: 토큰의 만료 시간

Public Claims (공개 클레임):

  • 충돌을 방지하기 위해 사용자 정의할 수 있는 클레임입니다. 서비스 간에 협의된 정보를 담을 수 있습니다.
  • name: 사용자 이름
  • admin: 관리자 여부

Private Claims (비공개 클레임):

  • 서비스와 클라이언트 간에 협의된 사용자 정보를 포함하는 클레임입니다. 이는 서버와 클라이언트 간에만 의미를 갖습니다.
  • 예를 들어, user_id, email, permissions 등이 비공개 클레임이 될 수 있습니다.

 

Signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImFkbWluIjogdHJ1ZSwgImlhdCI6IDE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  • Header와 Payload를 조합한 문자열에 비밀 키를 이용한 서명을 추가합니다.
  • 이들을 조합하면 위와 같은 JWT 토큰이 생성됩니다.

JWT의 구조 예시

xxxxxxxxxx.yyyyyyyyyy.zzzzzzzzzz
  • xxxxxxxxxx: Header를 Base64로 인코딩한 값
  • yyyyyyyyyy: Payload를 Base64로 인코딩한 값
  • zzzzzzzzzz: Header와 Payload의 조합을 서명한 값

JWT 인증 절차는?

  • 사용자가 id와 password를 입력하여 로그인을 시도
  • 서버는 요청을 확인하고 secret key를 통해 Access token을 발급
  • 인증 이후 사용자가 API를 요청할 때 Authorization header에 Access token을 담아서 요청
  • 서버는 JWT Signature를 체크하고 Payload로부터 user 정보를 확인하고 원하는 자원을 Return