본문 바로가기
Computer Science 📑

[Network/네트워크] JWT(Json Web Token)

by 서니서닝 2023. 3. 21.
728x90

JWT의 이야기에 앞서, 쿠키와 세션에 대한 내용은 요기 있습니다!

 

쿠키의 보안 문제를 보완해주는 것이 세션!

 

그러나, 세션은 HTTP의 Stateless를 위배한다.

서버의 세션 저장소라는 곳에 세션 ID, 즉 상태를 저장하기 때문이다. 

stateful한 인증을 사용하게 되면, 서버에 부담이 상대적으로 많이 가기 때문에 확장성이 낮아진다.

요청을 진행할 때마다 세션 저장소에 세션 ID를 조회하는 작업을 통해 DB접근이라는 로직이 한번 더 수행되는 것 또한 단점이다

 

이를 위해 등장한 것이 바로 JWT!

 

JWT(Json Web Toke)

인증에 필요한 정보들을 Token에 담아 암호화시켜 사용하는 토큰

인터넷에서 정보를 안전하게 전송하기 위한 오픈 표준으로, JSON 형태의 데이터를 사용한다.
클라이언트와 서버 간의 인증을 위해 사용됩니다.

JWT는 크게 세 부분으로 구성된다.

Header, Payload, Signature 이다. 각 부분은 Base64 인코딩된 문자열로 구성되어 있으며, 각 부분은 마침표(.)로 구분된다.

xxxxxx . yyyyy . zzzzzz

 

서명된 토큰

기본적인 인증을 진행하는 구조는 쿠키와 크게 다르지 않지만, 강조되는 것은 서명(Sinature)된 토큰 이라는 것이다.

JWT는 데이터의 무결성을 검증하기 위하여 서명을 사용한다. 

공개/개인 키 쌍으로 사용하여 토큰에 서명할 경우, 개인 키를 보유한 서버가 이 서명된 토큰이 정상적인 토큰인지 인증할 수 있다. (이와 관련된 비대칭키, 대칭키 내용)

 

1. Header

헤더는 JSON 형식으로 구성되어 있다.

암호화된 내용의 타입(JWT)과 사용된 알고리즘을 지정한다.

 

위의 예시에서는 토큰의 타입이 JWT이고, 개인키를 이용하여 HS256 알고리즘이 적용되어 암호화 되어 있다고 볼 수 있다.

 

2. Payload

페이로드는 JSON 형식으로 구성되어 있으며, 사용자 정보와 같은 클레임(Claim) 정보가 key-value 형태로 포함된다.

클레임에 무슨 값을 넣는지는 정해져 있지 않다.

 

클레임 정보는 등록, 공개, 비공개 세가지 타입으로 나누어진다.

  • 등록(Claims Registered) :
    • 토큰의 정보를 나타내기 위해 이미 정해진 크레임
    • ex) 토큰의 발급자, 만료기간, 발급 시간 등..
  • 공개(Public) :
    • 충돌이 방지된 이름을 가지고 있음
    • 클라이언트와 서버가 서로 협의하여 사용할 수 있음
  • 비공개(Private) :
    • 클라이언트와 서버 간에 협의하여 사용하는 클레임
    • 이를 사용하여 서버와 클라이언트는 추가 정보를 주고 받을 수 있다.

헤더와 페이로드 모두 json이 디코딩 되어 있을 뿐이지 특별한 암호화는 걸려있지않다.

그렇기 때문에 민감한 정보를 담지 않는다.

 

3. Signature

암호화된 문자열, 토큰이 유효함을 나타내는 정보Header, Payload, 서버에서 지정한 개인키를 조합하여 생성된다.이를 통해 JWT의 유효성을 검증할 수 있기 때문에 사용자는 조작할 수 없다.

 

 

📖 reference

JWT(Json Web Token) 알아가기

인증 방식 : Cookie & Session vs JWT

728x90

댓글