[WEB]JWT란?

무지성개발자·2023년 9월 9일
0

JWT(Json Web Tonken)

JWT란 Json포맷을 활용한 Claim기반의 웹 토큰이다. JWT는 Self-Contained 방식으로 토큰 자체를 정보로 사용하여 정보를 안전하게 전달하는게 특징이다. 일반적으로 클라이언트와 서버의 통신에서 Header에 포함시켜 보내며 권한 인가(Authorization)의 목적으로 쓰인다.

Claim 기반?
클레임 기반은 key-value로 이루어진 구조라고 생각하면 된다.

구조

JWT는 Header, Payload, Signature 3부분으로 구성 되어있으며, .을 구분자로 사용하고 각 부분은 Base64URL-Salf로 인코딩 돼있다.

Base64 vs Base64URL-Salf
Base64 URL-Safe 인코딩은 기본 Base64 인코딩에서 '+'(plus)는 '-'(minus)로, '/'(slash)는 '_'(underscore)로 대체된 인코딩 방법으로 JWT를 URI파라메터로 사용 할 수 있도록 했다.

{
  "alg": "ES256",
  "kid": "JWT"
}

헤더는 JWT를 어떻게 검증하는가에 대한 내용을 담고 있다. alg는 서명 시 사용하는 알고리즘, kid는 서명 시 사용하는 키(Public/Private Key)를 식별하는 값이다.

Payload

{
    "iss": "no-int",
    "iat": "1586364327"
}

내용을 당당하고 있는 부분이다. 페이로드의 속성 값들을 ClaimSet이라고 부르며 클라이언트와 서버 간 주고 받기로 약속한 값들로 구성된다.

페이로드를 구성하는 클레임은 등록클레임과, 공개 클레임으로 구분된다. 등록 클레임은 토큰 정보를 표현하기 위해 이미 정해진(약속된) 종류의 데이터이며, 공개 클레임은 사용자가 정의한 클레임 값이다.

등록 클레임 값

  • iss : 토큰 발급자(issuer)
  • sub : 토큰 제목(subject)
  • aud : 토큰 대상자(audience)
  • exp : 토큰 만료 시간(expiration), 숫자로 표시
  • nbf : 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화되지 않음
  • iat : 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간을 알 수 있음
  • jti : JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용

Signature

헤더와 페이로드를 합친 문자열을 서명한 값이다. 헤더에 정의된 alg알고리즘과 비밀키를 사용해서 생성 후 인코딩한다.

장단점

장점

  • 사용자 인증에 필요한 모든 정보가 토큰 자체에 있어 별도의 인증 저장소가 필요없다.
  • MSA환경에서 별도의 인증 서버에 의존하지 않고 쉬운 인증/인가 방법을 제공.
  • URL 파라미터와 헤더로 사용 가능.
  • 디버깅 및 관리가 용이.
  • 트래픽에 부담이 낮음.
  • REST 서비스로 사용가능.

단점

  • 토큰 자체에 정보를 담고 있어 탈취 당하면 노출 될 수 있음.
  • 임의삭제가 불가능. 반드시 만료시간을 넣어줘야 함.
  • 정보가 많아지면 토큰이 길어짐.

한 줄평 : 공식 사이트 https://jwt.io/ 에서 Header, Payload, Signature를 사용해서 토큰을 바로 만들어 볼 수 있다.

참고 -
https://meetup.nhncloud.com/posts/239
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://mangkyu.tistory.com/56

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글