본문 바로가기
보안

[JWT] JSON Web Token 이란?

by 원동호 2021. 5. 1.
반응형

1. 개념

JWT는 일반적으로 클라이언트와 서버, 서비스와 서비스 사이 통신시 권한 인가(Authorization)를 위해 사용하는 토큰이다. URL에 대해 안전한 문자열로 구성되어 있기 때문에 HTTP 어디든(URL, Header,...)지 위치할 수 있다.

 

2. 구조

Header.Payload.Signature

헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분을 점(dot)으로 구분하는 구조이다.

1) Header

JWT를 검증하는데 필요한 정보를 가진 JSON 객체는 Base64 URL-Safe 인코딩된 문자열이다. 헤더(Header)는 JWT를 어떻게 검증(Verify)하는가에 대한 내용을 담고 있다. alg는 서명 시 사용하는 알고 리즘이고, typ은 토큰의 타입이다.

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

2) Payload(Claim set)

JWT의 내용이다. 페이로드(Payload)에 있는 속성들을 클레임 셋(Claim Set)이라 부른다. 클레임 셋은 JWT에 대한 내용(토큰 생성자(클라이언트)의 정보, 생성 일시 등)이나 클라이언트와 서버 간 주고 받기로 한 값들로 구성된다. JWT는 토큰을 디코딩해서 바로 값을 확인할 수 있는 구조로 되어있어서 DB조회할 필요없이 사용자 아이디 등을 담아서 바로 사용할 수 있다.

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Claim Set은 키 부분인 Claim Name과 값 부분인 Claim Value의 여러 쌍으로 이루어져 있다. Claim Name으로 사용 가능한 값에는 3가지 분류가 있는데 등록된 클레임 이름(Registered), 공개 클레임 이름(Public), 비밀 클레임 이름(Private)이다.등록된 클레임 이름은 IANA JSON Web Claims에 등록된 이름이고 필수 값은 아니지만 공통으로 사용하기 위한 기본값이 정해져 있다. 아래 목록이 등록된 클레임 이름인데 모두 선택 사항이다.

  • iss : 토큰을 발급한 발급자(Issuer)
  • sub : Claim의 주제(Subject)로 토큰이 갖는 문맥을 의미한다.
  • aud : 이 토큰을 사용할 수신자(Audience)
  • exp : 만료시간(Expiration Time)은 만료시간이 지난 토큰은 거절해야 한다.
  • nbf : Not Before의 의미로 이 시간 이전에는 토큰을 처리하지 않아야 함을 의미한다.
  • iat : 토큰이 발급된 시간(Issued At)
  • jtl : JWT ID로 토큰에 대한 식별자이다.

공개된 클레임이름은 토큰에서 사용하기 위해서 정의했지만, 충돌을 방지하기 위해서 공개된 이름이고 비밀 클레임이름은 서버와 클라이언트가 협의로 사용하는 이름을 의미한다.

 

3) Signature

헤더와 페이로드는 암호화를 한 것이 아니라 단순히 JSON 문자열을 base64로 인코딩을 했다. 그래서 누구나 이 값을 다시 디코딩하면 JSON에 어떤 내용이 들어있는지 확인할 수 있다. 토큰을 사용하는 경우 이 토큰을 다른 사람이 위변조할 수 없어야 하므로 헤더와 페이로드가 위변조되었는지를 검증하기 위한 부분이 Signature 부분이다. 헤더와 페이로드를 base64로 인코딩해서 만든 두 값을 점(dot)으로 이어 붙이고 헤더에서 alg로 지정한 알고리즘 HS256 즉, HMAC-SHA-256으로 인코딩하면 JWT 토큰의 세 번째 부분인 Signature를 만들 수 있다.

 

3. 장점

  • 중앙의 인증서버, 데이터 스토어에 대한 의존성 없기 때문에 시스템 수평 확장에 유리하다.
  • Base64 URL Safe Encoding을 이용하기 때문에 URL, Cookie, Header 모두 사용 가능하다.

4. 단점

  • Payload의 정보가 많아지면 네트워크 사용량 증가, 데이터 설계 고려가 필요하다.
  • 토큰이 클라이언트에 저장, 서버에서 클라이언트의 토큰을 조작할 수 없음.

 

도움이 되셨다면 하트 부탁드립니다♥

 

출처

https://meetup.toast.com/posts/239

https://jwt.io/

https://blog.outsider.ne.kr/1160

반응형

댓글