본문 바로가기
spring_boot/security

JWT란?

by 잡다한 개발자 정모씨 2024. 4. 7.

JWT(Json Web Token)

Json 포멧을 이용하여 사용자 정보를 담아 비밀리에 정보 전달 및 인증할 때 주로 사용하는 Claim기반의 Web Token이다.

 

Json 형식으로 주고 받기 위해 표준 규약에 의해 암호와 되어 복잡한? String 형태로 이루어져 있다.

 

JWT 구성요소

JWT는 Header(헤더), Payload(페이로드), Signature(서명) 으로 이루어져 있으며, Json 형태로 각 부분이 Base64로 encoding되어 표현된다. 

1. Header(헤더)

토큰의 헤더는 alg, typ로 이루어 진다. 

  • alg: 알고리즘 형식을 지정하며, 서명 및 토큰의 증에 사용 ex)HS256
  • typ: 토큰의 타입을 지정 ex)JWT

2. Payload(페이로드)

토큰에서 사용할 정보들인 Claim들이 담겨져 있다.

클레임은 총3가지로 Json 형태의 key: value 형태로 값을 넣을 수 있다.

 

  • 등록된 클레임(Register Claim)

등록된 클레임은 토큰의 정보를 표현하기 위해 이미 정해진 종류의 데이터, 모두 선택적으로 작성이 가능하며 사용할 것을 권장한다. 또한 JWT에서 사용을 간견하기 위해 key의 길이를 3으로 지정해놓았다.

  • iss: 토큰 발급(issuer) → 개발자 email을 넣는 편
  • sub: 토큰 제목(subject) → unique한 값을 넣어야 해서 사용자의 email을 넣는 편
  • aud: 토큰 대상자(audience)
  • exp: 토큰 만료 기간(expiration), NumericDate 형식으로 되어 있어야 함
  • nbf: 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화 되지 않음.
  • iat: 토큰 발급 시간(issued at), 토큰 발급 이후 시간의 경과를 알 수 있음.
  • jti: JWT 토큰 식별자(JWT Id), 중복 방지를 위해 사용. 일회용 토큰(Access Token)에 사용하면 유용함
  • 공개 클레임(Public Claim)

공개 클레임들은 충돌 방지를 위해서 URL 포멧을 이용하며 공개용 정보를 위해 사용됩니다. 

{
    "https://taeyang1234098.tistory.com": true
}
  • 비공개 클레임(Private Claim)

등록된 클레임도 아니고, 공개된 클레임도 아님 사용자 정의 클레임으로, 서버와 클라이언트 사이에 임이로 정해놓은 정보를 저장한다. :)

{ 
    "How_do_you_feel_today?": happy 
}

 

3. Signature(서명)

토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 암호화 코드, 헤더와 페이로드의 값을 인코딩하고, 그 값을 시크릿 키를 사용해 헤더에서 정의한 알고리즘으로 해싱을 하여 이 값을 다시 인코딩하여 생성한다.

 

이렇게 생성된 JWT Token은 HTTP 통신을 할때 Header에 Authrization 담겨져, 앞에 Bearer 토큰임을 명시한 후 값을 넣어 사용한다.

headers: {
	Authorization: `Bearer ${token}`,
},

 

 

JWT 링크: https://jwt.io/