JWT 이해하기

고은정·2021년 3월 27일
1

개발포스팅

목록 보기
1/20
post-thumbnail

JWT?

JWT를 사용하기전에 무엇인지부터 알아보겠습니다.

JWT는 Json Web Token을 뜻합니다. Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token으로, JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달합니다.

장점

  1. 별도의 인증 저장소가 필요X
  2. 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 인가 방법
  3. 쉬운 확장성
  4. 독립적인 JWT

단점

  1. 클라이언트에 저장되기 때문에 데이터베이스에서 조작하더라도 토큰에 적용X
  2. 많은 필드 추가 시 토큰의 크기가 커짐
  3. 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향

JWT 이해하기

구조!

토큰의 구조는 header.payload.signature 로 이루어져 있고 .이 구분자 역할을 합니다.

header (헤더)

header는 토큰의 타입(typ)해싱 알고리즘 정보(alg)를 가지고 있습니다.
토큰의 타입은 JWT이고, 해싱 알고리즘은 보통 SHA256을 사용합니다. 이 알고지즘은 signature에서 토큰 검증을 위해 사용됩니다. 아래와 같이 사용합니다.

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

payload (정보)

payload는 여러 정보들이 담겨있습니다. 정보 하나하나를 클레임(claim)이라고 하며 name/value의 형태로 이루어져 있습니다. 클레임의 종류와 특징은 다음과 같습니다.

1. 등록된(Registered) 클레임 : 이미 등록된 클레임을 선택적 사용

  • iss: 토큰 발급자
  • sub : 토큰 제목
  • aud : 토큰 대상자
  • exp : 토큰 만료시간. NumericDate형식
  • nbf : NotBefore. 토큰의 활성날짜. NumericDate형식
  • iat : 토큰 발급시간을 사용해서 토큰의 age 확인
  • jti : JWT 고유식별자.

2. 공개(public) 클레임 : 충돌이 방지된 이름

{ "https://velog.io/@eunjeong": true }

3. 비공개(private) 클레임 : 사용자 정의

{ "token_type": access }

payload의 예제는 다음과 같습니다.

{
    "iss": "velog.io/@eunjeong",
    "exp": "1485270000000",
    "https://velog.io/@eunjeong/jwt_claims/is_admin": true,
    "username": "eunjeong"
}

signature (서명)

signature는 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드

Debugger

jwt의 Debugger에서 생성되는 토큰을 확인하거나 생성된 토큰을 검증할 수 있습니다.

참고

profile
개발이 하고싶어요

0개의 댓글