본문 바로가기

개발/Others

[보안] JWT란 무엇일까

최근 웹개발에 있어 인증, 인가는 거의 JWT를 기반으로 이루어지는 것 같다.

 

이전에 Spring Security + JWT 도입을 통해 간단하게 사용하는 방법은 알아보았지만, JWT 그 자체에 대해서는 자세하게 적지 못한 것 같아. 이번에 조금 더 디테일하게 정리해보고자 한다.


JWT(JSON Web Token) 은 Json 형태의 인증 토큰으로, 웹 표준을 따르고 있기 때문에, 대부분의 언어에서 지원된다.

JWT는 https://jwt.io/ 에서 생성해볼 수 있다.

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

먼저 아래와 같이 값을 넣고 생성한다.

그 결과 아래와 같은 형태로 생성이 된다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImthZHVuIiwiaWF0IjoxNTE2MjM5MDIyfQ.YytZbYwKE2duBUV79ImIowK90KGcpqEJdw7Yrp4xo6o

토큰을 확인해보면, 콤마(.)를 기준으로 세 영역으로 구분되어 있음을 확인할 수 있다.

각 영역들은 Header(헤더), Payload(내용), Signature(서명) 으로 구분된다.

출처 : https://velopert.com/2389


각 영역을 살펴보자

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

헤더에서는 해시 알고리즘과 토큰의 타입을 정의할 수 있다.

#Payload
{
  "sub": "1234567890",
  "name": "kadun",
  "iat": 1516239022
}

내용에서는 Body 역할을 하는 내용들을 포함시킨다. 이러한 내용들을 "claim" 이라고 한다.

클레임은 3가지로 분류된다.

  1. registered claim
    이미 이름이 정해져 있는 클레임이다. 주로 3자로 key 를 작성하는 규칙이 있다.
    • iss: 토큰 발급자 (issuer)
    • sub: 토큰 제목 (subject)
    • aud: 토큰 대상자 (audience)
    • exp: 토큰의 만료시간 (expiraton)
    • nbf: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념
    • iat: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 기간을 판단한다.
    • jti: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용
  2. public claim
    공개 클레임은 사용자 마음대로 지정할 수는 있으나, 충돌 방지를 위해 이름을 URI 형식으로 짓는다.
  3. private claim
    주로 클라이언트와 서버 간에 사용되는 비공개 클레임이다. 충돌에 유의해야 한다.

마지막으로 서명 부분을 만드는 부분은 아래와 같다.

#signature
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  my-secret
)

이번 예제에서는 "my-secret" 이라는 문자열을 비밀키로 지정하고 base64로 인코딩 했다.

 

참고로 대부분의 언어에는 JWT를 직접 인코딩하거나 해싱하지 않아도 되도록, 적절한 라이브러리를 지원해주고 있다.

이전 포스팅에서 라이브러리의 사용법은 이미 작성해두었다.


참고

https://velopert.com/2389

 

[JWT] JSON Web Token 소개 및 구조 | VELOPERT.LOG

지난 포스트에서는 토큰 기반 인증 시스템의 기본적인 개념에 대하여 알아보았습니다. 이 포스트를 읽기 전에, 토큰 기반 인증 시스템에 대해서 잘 모르시는 분들은 지난 포스트를 꼭 읽어주세

velopert.com

https://velog.io/@maintain0404/JWT%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

JWT에 대해 알아보자

Oauth에 많이 쓰이는 JWT에 대해 알아보자

velog.io