SW개발/IT 용어

[JWT]JWT란? (JSON Web Token)

요즘에는 웹개발을 하다보면 필수적으로 등장하는 단어가 있습니다. 바로 JWT 인데요, 오늘은 이것에 대해 파헤쳐보려고 합니다. 굉장히 많이 언급이 되는만큼 JWT에 대한 중요성은 높다고 할 수 있습니다.

 

JWT는 무엇이고 탄생 배경과 어떤 구조를 가지고 있는지 알아보도록 하겠습니다.

 

JWT 란?

JSON Web Token의 약어이며, 사전적 정의는 다음과 같습니다.

JWT는 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기위한 인터넷 표준으로, 페이로드는 몇몇 claim을 assert 처리하는 JSON을 보관하고 있다. - 위키백과

 

조금 더 풀어서 설명하자면, 여러가지 정보를 담고 있는 JSON 형태의 토큰이라고 할 수 있습니다. 일반적으로는 웹서비스의 인증 시스템에서 주로 사용됩니다.

 

JWT의 탄생 배경

인터넷과 스마트 기기의 보급률이 늘어남에 따라 전세계의 트래픽 역시 나날이 증가하고 있습니다.

전통적인 세션 인증 방식의 경우에는 Stateful 방식입니다. 즉, 서버에서 세션에 대한 상태를 알고 있다는 뜻입니다. 그렇기에 매 요청마다 서버와 통신을 해야했고, 이는 곧 많은 트래픽 앞에서 서버 부하의 원인이 되기도 합니다.

 

JWT는 이러한 문제점들을 해결하기 위해 등장했습니다. Stateless인 것이 특징입니다.

토큰안에 미리 인증에 필요한 정보들을 넣어둠으로써 매 요청마다 서버와 통신을 할 필요가 없게 되었습니다. 이로 인해서 서버 부하와 같은 문제점들을 해결할 수 있게 되었습니다.

 

또한, 최근에 MSA 구조가 인기를 끌었던 것도 JWT의 인기에 한 몫 더했다고 생각합니다. 무수히 많은 내부 서비스들이 통신 및 인증을 하는데 Stateless인 JWT가 적합했기 때문입니다.

 

하지만 JWT를 선택함에 따라 자연스럽게 따라오는 문제점들도 있습니다. 서버에서 한번 발급된 이후로는 토큰에 대한 제어권을 상실하므로 탈취와 같은 상황에서 유연하게 대응할 수 없습니다.

 

JWT의 구조

JWT는 헤더, 페이로드, 서명 3가지의 파트로 나뉘어져 있습니다.

 

헤더

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

서명 생성을 위해 어떤 알고리즘을 사용할지 식별하는 부분입니다.

alg에서는 알고리즘 방식을 지정할 수 있고 서명 및 토큰 검증과 생성에 사용됩니다. typ에서는 토큰의 타입을 지정할 수 있습니다.

 

페이로드

{
    "iss": "https://leffept.tistory.com",
    "aud": "https://leffept.tistory.com",
    "iat": 1356999524,
    "exp": 1399999999,
    "name": "leffe",
    "location": "seoul"
}

일련의 클레임을 포함합니다. 토큰의 목적에 따라서 여러가지 정보를 이곳에 추가할 수 있습니다.

그러나, 민감한 정보는 포함하지 않는 것이 좋습니다. JWT 토큰은 디코딩을 통해 들어있는 정보를 확인하는 것이 매우 쉽습니다.

 

필수적이진 않지만 일반적으로 사용되는 7가지의 등록된 표준 클레임도(Registered claims) 존재합니다.

  • iss (issuer) : JWT의 발행자
  • sub (subject) : JWT의 제목
  • aud (audience) : JWT가 의도된 수신자
  • exp (expiration time) : JWT가 만료되는 시간
  • nbf (not before time) : JWT의 활성 날짜. 해당 날짜 이전에는 토큰이 처리되지 않음
  • iat (issued at time) : JWT가 발급된 시간. JWT의 수명을 결정하는데 사용할 수 있음
  • jti (JWT ID) : 고유 식별자, JWT가 재생되는 것을 방지하는데 사용할 수 있음

https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-token-claims#registered-claims

 

Auth0

Get started using Auth0. Implement authentication for any kind of application in minutes.

auth0.com

 

서명

HMAC-SHA256(
    secret,
    base64urlEncoding(header) + '.' +
    base64urlEncoding(payload)
)

서명은 토큰을 인코딩하거나 유효성 검증을 위해 이용되는 부분입니다.

 

서명을 만들기 위한 절차는 다음과 같습니다.

  1. 헤더와 페이로드를 Base64URL을 통해 인코딩하고, 이 둘을 점(.) 구분자로 함꼐 연결합니다
  2. 헤더에서 정한 알고리즘과 secret key값을 통해 암호화(해싱)한 값을 Base64URL 인코딩 합니다
  3. 이 결과로 나온 값이 서명부분 입니다.

 

토큰의 형태

JWT는 위에서 설명한 헤더, 페이로드, 서명부분의 각 값을 모두 점(.) 구분자로 연결지어 탄생됩니다. 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

아래의 페이지를 통해서 토큰을 생성하거나 디코딩 해볼 수 있습니다.

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



오늘은 JWT란 무엇이며, 그 구조는 어떻게 이루어져 있는지에 대해서 알아보았습니다.

다음 포스팅에서는 JWT를 사용할 때 주의할 점들에 대해서 다뤄보겠습니다.

 

읽어주셔서 감사합니다 :)

 

 

728x90