JWT

doppelgoer
|2024. 2. 24. 19:13

JWT란?

JWT 란 JSON Web Token 의 약자로 말 그대로 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격이다. 정보를 안전하게 전송하기 위한 토큰 형식이다. JWT 는 자가 수용적(Self-contained)이다. 자가 수용적이란 토큰 자체에 필요한 모든 정보가 담겨 있어 별도의 저장소가 필요하지 않다는 의미이다. JWT는 JSON 객체를 사용하여 정보를 저장하고 디지털 서명을 통해 검증한다

 

JWT 토큰은 주로 인증과 정보교환에 사용된다.

인증(Authentication) :  사용자가 로그인하면, 서버는 사용자의 정보를 담은 JWT 토큰을 발급한다. 사용자는 이 토큰을 쿠키나 로컬 스토리지에 저장하고, 서버에 요청할 때마다 토큰을 함께 보낸다. 서버는 토큰을 검증하여 사용자를 인증한다.

 

정보 교환(Information Exchange) : 두 개체가 안전하게 정보를 주고받을 수 있다. 토큰에 담긴 정보는 디지털 서명에 의해 보호되므로, 정보의 신뢰성을 보장할 수 있다.

 

웹에서 Authorization HTTP 헤더를 Bearer <JWT토큰> 의 형태로 설정하여 클라이언트에서 서버로 전송된다. 서버에서는 받은 JWT 토큰에 서명확인은 통해서 위변조 여부를 검증한다.

 


 

 

JWT 구조

JWT 토큰은 헤더(header), 페이로드(payload), 서명(signature) 이렇게 세 부분으로 이루어져 있다. JWT 는 네트워크에서 전송이 되어야 하기 때문에 용량을 적게 차지하는 것이 좋기에 JSON key를 3글자로 줄여뒀다.

 

 

header

JWT의 유형(typ) 및 사용하는 암호화 알고리즘(alg) 등에 대한 정보를 포함한다. 또한 헤더는 Base64 로 인코딩되어 있다.

{
  "alg": "HS256",
  "typ": "JWT"
}

위는 헤더의 알고리즘은 HMAC SHA-256 을 사용했고, 타입은 JWT라는 것을 보여준다

 


payload

JWT 에서 payload는 실제로 전달하고자 하는 정보를 포함하고 있다. 예를 들어 사용자의 ID, 이름, 닉네임 등이 포함될 수 있다. 여기에 담긴 정보단위를 클레임(claim)이라고 하며, key / name 한 쌍으로 이루어져 있다. 토큰에는 여러 개의 클레임을 넣을 수 있으며 주로 발급자, 만료시간, 사용자 식별자 등의 정보나, 사용자의 권한, 역할, 선호도 등과 같은 사용자에 관한 정보를 담는다.

 

클레임은 세가지로 이루어져 있다.

  • Registered Claims ( 등록된 클레임)
  • Public Claims(공개 클레임)
  • Private Claims(비공개 클레임)
 

Registered Claims(등록된 클레임)

토큰에 대한 정보를 표현하기 위해 미리 정의된 클레임이다. 등록된 클레임은 토큰의 기본적인 정보를 제공하고, 토큰의 유효성 검사에 사용될 수 있다

  • iss (Issuer): 토큰 발급자를 나타낸다. 보통은 토큰을 발급한 서버의 도메인이나 식별자이다. 
  • sub (Subject): 토큰의 주제를 나타낸다. 주로 토큰을 발급받는 사용자의 식별자나 ID이다. 
  • aud (Audience): 토큰의 대상(받는 사람)을 나타낸다. 토큰이 발행되는 서비스나 애플리케이션을 나타내는 보통의 문자열이 될 수 있다. 
  • exp (Expiration Time): 토큰의 만료 시간을 나타낸다. 이 시간 이후에는 토큰이 더 이상 유효하지 않다. 
  • nbf (Not Before): 토큰이 사용될 수 있는 시간을 나타낸다. 이 시간 이전에는 토큰을 사용할 수 없다. 
  • iat (Issued At): 토큰이 발급된 시간을 나타낸다. 
  • jti (JWT ID): JWT의 고유 식별자를 나타낸다. 토큰의 중복 사용을 방지하기 위해 사용될 수 있다.

 

 

Public Claims(공개 클레임)

Public Claims(공개 클레임)은 JWT의 페이로드에 포함되는 사용자 정의 클레임이다. 공개된 클레임은 충돌을 방지하기 위해 URI 형식으로 이름을 지정해야 한다

{
	"https://doppelgoer.tistory.com" : true
 }

 

 

Private Claims(비공개 클레임)

비공개 클레임은 사용자가 직접 정의하는 클레임이다. 비공개 클레임을 사용해서 사용자의 권한등을 추가할 수 있다.

 


signature

JWT의 서명은 JWT의 무결성을 보장하고, 변조를 방지하기 위한 부분이다. 헤더와 페이로드를 base64 로 인코딩하고, 비밀키나 공개키/비밀키 쌍을 사용하여 암호화 한 값이다.

 

 

 

개인 기록용입니다. 만약 잘못된 부분이 있다면 댓글로 알려주신다면 감사하겠습니다!