스프링 공부/이론 정리

[이론정리] Json Web Token

장아장 2023. 1. 4. 18:09

진짜 어디든 있는 JWT, Json Web Token에 대해서 간단하게 정리를 해보려고 한다. 

모든 내용은 JWT 공홈 설명에서 발췌했다. 


JWT란 무엇인가?

Json Web Token, 이하 JWT란 일종의 전자 서명으로 사용자가 직접 가지고 있는 컴팩트한 토큰이다. 

전자서명처럼 어떤 사용자인지 JWT를 통해 알 수 있다. 

HMAC알고리즘을 사용하며, RSA나 ECDSA같은 공개키와 개인키를 이용한 암호화가 이루어져 있다. 

 

JWT를 통해 그 속에 담긴 안에 있는 claim(주장, 혹은 내용)의 무결성을 검증할 수 있다. 비대칭키(공개키와 개인키가 서로 다르지만 이를 토대로 암호화, 복호화가 되는) 암호화를 통해 토큰이 만들어졌을 때, 해당 사용자만 토큰을 토대로 인증을 할 수 있게 한다. 


JWT를 언제 써야할까?

인증이나 정보교환에 쓰인다. 

  • 인증
    JWT를 쓰는 가장 일반적인 경우이며, 한번 로그인을 하면 사용자는 JWT를 받는다. 이 토큰은 모든 요청에 같이 따라오며, 이 토큰의 권한으로 허가된 모든 접근을 허용해준다. 
  • 정보 교환
    두 대상 간에 안전한 정보 교환을 가능하게 해준다. 또한, JWT에는 해당 사용자에 대한 정보가 들어있어, 전송자가 맞는지 확인할 수 있다. 또한, 이러한 서명은 헤더와 본문으로 사용되어, 정보 전송중에 오류가 없음을 확인할 수 있다. 

JWT의 구조

Header.Payload.Signature의 구조로 이루어져 있다. 

각 부분은 암호화 되어있으며, 암호화된 내용은 아래와 같다. 

Header

알고리즘의 이름과

토큰의 타입

 

 

Payload

주로, 사용자에 대한 정보들이 들어있다. 

이를 Claim이라고 하며, 사진 외의 다른 내용이 들어있을 수 있다. 

 

 

Signature

위의 Header.Payload의 내용을 키를 이용해 암호화시킨 구조이다. 

 

이 3개를 합쳤을 때,

암호문.암호문.암호문

의 구조를 가지게 된다.


JWT의 작동 원리

사용자가 로그인하면, 로그인한 사용자의 정보를 토대로 JWT를 만든다. 보안의 이슈 때문에 필요한 정보만을 가지고, 암호화를 해서 토큰을 만들어야 한다. 

전형적으로는, 모든 요청에 대해 Authorization 헤더에 Bearer 스키마를 이용해 토큰이 들어온다. 

 

 

이런식으로 들어온 헤더에서, 복호화를 통해 필요 정보들을 가져와 권한을 확인하고, 이상이 없을 경우 요청에 대한 응답을 준다. 

또한, http 프로토콜을 사용시, 헤더의 길이는 8kb보다 작게 나와야 한다. 그 이상의 헤더를 허용하지 않는 경우가 있기 때문이다. 

Authorization헤더에 토큰이 존재할 경우, 쿠키를 사용하지 않기 때문에 CORS에 대한 이슈가 존재하지 않는다. 

 

  1. 사용자는 권한 서버에 접근해 권한을 요청한다. 
  2. 권한을 받으면 서버에 대한 억세스 토큰을 받는다. 
  3. 토큰을 통해 Resource Server에 대한 접근이 가능해진다. 

토큰을 사용할 때에는, 비밀번호와 같은 중요하게 다뤄야 할 정보는 넣지 말아야 한다. 만약에 대한 보안상의 문제에 위험이 될 수 있다.