JWT...?

유웅조·2020년 1월 14일
0

JWT란..?

JWT는 Json Web Token의 약자로 토큰 기반 인증 시스템에서 활용되는 웹표준의 JSON 객체이다. JWT는 그 자체로 필요한 정보를 모두 갖고 있다. 웹서버의 경우 대부분 HTTP의 헤더에 넣어서 전달되거나, URL의 파라미터로 전달된다.

JWT는 .을 기준으로 총 세 가지의 문자열로 구성되어 있다. header.payload.signature 이런 형태로 구성되어 있다.

Header는 두 가지의 정보를 갖고 있다. 먼저 typ은 토큰의 타입을 말한다. JWT의 경우 jwt가 될 것이다. 그리고 alg가 있다. alg는 해싱에 사용할 알고리즘을 말한다. 대부분 SHA-256 해싱 함수를 사용한다.

Payload

Payload에는 토큰에 담을 정보가 담겨있다. 이 정보들은 name/value의 쌍으로 이루어져있고 한 쌍을 Claim 클레임이라고 부른다. 클레임에는 총 3가지가 있다. Registered Claim 등록된 클레임 / Publick Claim 공개 클레임 / Private 비공개 클레임.

  1. 등록된 클레임
  • 필요한 정보들이 아닌, 토큰에 대한 선택적인 정보들을 말한다.
  • iss: 토큰 발급자
  • sub: 토큰 제목
  • aud: 토큰 대상자
  • exp: 토큰의 만료기간(형식은 NumericDate)
  • nbf: 토큰의 활성 날짜(형식은 NumericDate)
  • iat: 발급된 시간
  • jti: 고유 식별자(일회용 토큰에 주로 사용)
  1. 공개 클레임
  • 충돌이 방지된 이름을 갖는다.
  • 주로 URI 형식으로 짓는다.
  1. 비공개 클레임
  • 클라이언트 <--> 서버 사이에 사용되는 클레임 이름이다.
  • 충돌을 주의해야 한다.
{
  "iss": "mysite.com",
  "exp": "1485270000000",
  "https://mysite.com/is_admin": true,
  "userId": "1234",
  "username": "onikss793"
}

Signature

Header의 인코딩된 값과 Payload의 인코딩된 값을 함친 후, 정해둔 비밀키로 해시하여 만든다.

2개의 댓글

comment-user-thumbnail
2020년 1월 14일

Signature의 설명에
"Payload의 인코딩된 값"이 두번 등장해요

1개의 답글