JWT(JSON Web Token) 란 무엇인가?

배우다·2020년 6월 13일
0

spring-with-jwt

목록 보기
1/1
post-thumbnail

※ 참고 자료

JWT.IO - JSON Web Tokens Introduction

[JWT] JSON Web Token 소개 및 구조

[Server] JWT(Json Web Token)란?


# JWT Authentication 란 ?

JSON Web Token (JWT) 는 웹표준(RFC 7519)으로서 두 개체에서 JSON 포맷을 사용하여 가볍고 수용적인 자가수용(self-contained) 방식으로 정보를 안전하게 전달한다. 주로 회원 인증과 두 개체 사이에서 정보 전달을 할때 사용 된다.

# JWT의 특징

자가수용적이다 (Self-contained)

JWT는 필요한 모든정보를 자체적으로 지니고 있다. JWT 시스템에서 발급된 토큰은 토큰에 대한 기본정보, 전달 할 정보, 토큰이 검증되었다는 것을 증명해 주는 signature 를 포함하고 있다.

쉽게 전달 될 수 있다.

JWT는 자가 수용적(self-contained)적이기 때문에 두 개체에서 손쉽게 전달 될 수 있다. 웹서버의 경우 HTTP 헤더에 넣어서 전달 또는 URL의 파라미터로 전달 할 수 있다.


# JWT 의 구조

JWT 토큰은 . 을 구분자로 3가지 문자열로 구성되어 있다.

헤더 (Header)

Header는 typ와 alg 두가지로 구성 되어 있다.

  • typ : 토큰의 타입을 지정 (JWT)
  • alg : 해싱 알고리즘을 지정, HAMAC SHA256 , RSA 을 사용한다. 이 알고리즘은 토큰을 검증 할 때 사용되는 signature 부분에 사용.
{
  "alg": "HS256",
  "typ": "JWT"
}

내용 (Payload)

Payload는 토큰에 담을 정보가 들어 있습니다. 여기에 담는 정보의 한 조각을 'claim' 이라고 부르고, 이는 Key / Value의 한 쌍으로 이루어져 있다. 토큰에는 여러 클레임들을 넣을 수 있다.

Claim의 분류는 총 세가지로 이루어져 있다.

  • 등록된 (registered) 클레임
  • 공개 (public) 클레임
  • 비공개 (private) 클레임
  1. 등록된 클레임 (Registered Claim)

    등록된 클레임은 토큰에 대한 정보를 담기위한 미리 정의된 클레임의 집합이다. 등록된 클레임의 사용은 선택적으로 사용 가능하지만 사용하는 것을 권장한다.

    • iss : 토큰 발급자 (issure)
    • sub : 토큰 제목 (subject)
    • aud : 토큰 대상자 (audience)
    • exp : 토큰 만료시간 (expiration), 시간은 NumericDate ( ex :1480849147370 ) 형식이어야 하며 언제나 현재 시간 이후여야 한다.
    • nbf : Not Before 를 의미 하며, 토큰 활성 날짜와 비슷한 개념이다. NumericDate 형식이어야 하며, 이 날짜기 지나기 전까지는 토큰을 처리하지 않는다.
    • iat : 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단 할 수 있다.
    • jti : JWT 의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용 된다. 일회용 토큰에 사용하면 유용하다.
  2. 공개 클레임 (Public Claim)

    공개 클레임은 사용자 정의 클레임으로. 공개용 정보 전달을 위해 사용된다. 충돌 방지를 위해 URI 포맷을 이용해야 한다.

    {
        "https://tandohak.co.kr/is_authenticated": true
    }
  3. 비공개 클레임 (Private Claim)

    비공개 클레임은 등록된 클레임도 아니고, 공개 클레임도 아닌 당사자간에 정보를 공유하기 위해 만들어진 사용자지정 클레임이다. 공개 클레임과 달리 이름이 중복되어 충돌이 될 수 있으니 유의 해야 한다.

    {
        "username": "tandohak"
    }

페이로드의 예제

{
    "iss": "tandohak.co.kr", // 등록된 클레임
    "exp": "1485270000000", // 등록된 클레임
    "https://tandohak.co.kr/is_authenticated": true, // 공개 클레임
    "username": "tandohak" // 비공개 클레임
}

서명 (Signature)

서명은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 서명은 위서 만든 헤더와 페이로드의 값을 각각 BASE64로 인코딩 하고, 인코딩 한 값을 비밀 키를 이용하여 헤더에서 정한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩 하여 생성한다.

JWT 토큰의 예시

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
profile
안녕하세요. JAVA, SPRING, VUEJS, NUXT 사용하는 백엔드 개발자입니다.

0개의 댓글