[ 기술 스터디 ] JWT 토큰

김민석·2021년 7월 14일
0

기술 스터디

목록 보기
15/18

지금까지 JWT 토큰을 사용해서 로그인, 로그아웃 로직을 구현했다.
또한, JWT를 사용할 때마다 다시, 사용 방법이나 구성 요소에 대해 찾아보고는 했다.
구현에만 집중하다보니 나의 언어로 JWT를 설명하지 못하는 것 같아서 정리하고자 한다.

참고 : https://meetup.toast.com/posts/239


JWT(JSON Web Token)이란?

JSON Web Token (JWT) is a proposed Internet standard for creating data with optional signature and/or optional encryption whose payload holds JSON that asserts some number of claims.

JWT는 인터넷 표준으로서 디지털 서명이나 암호화를 거쳐 데이터를 만드는 규칙이다. 이렇게 만들어진 데이터는 JSON으로 이루어진 claim들을 갖고 있게 된다.

claim은 인증이 필요한 주체가 넘겨주는 데이터라고 생각하면 된다. 사용자가 어플리케이션을 이용하는데에 필요한 정보? 정도로 이해하였다.
SOF 답변을 참고하자

JWT의 사용처

  • 클라이언트 인증 :

JWT로 로그인/로그아웃을 구현할 때 사용한 것을 기억하면 된다.
유저가 로그인을 하면, 유저 정보에 기반하여 토큰을 생성하여 유저에게 전달한다.
이후 유저는 매 요청시마다 서버에 JWT 토큰을 포함하여 전달한다.
서버는 매 요청시마다, 같이 오는 토큰이 유효한지 확인하고 내부의 claims를 통해 권한을 확인하여 작업을 처리한다.

  • 정보 공유

JWT 토큰은 내부의 정보가 서명되어 있고, 암호화되어 있기 때문에 안전하게 정보를 공유할 수 있는 방법 중 하나다.


JWT 구성 요소.

jwt는 이렇게 생겼다.
잘 보면 .에 의해 3가지의 문자열로 되어있는 것을 알 수 있다.

헤더는 두 가지 정보를 갖는다.

1. typ : 토큰의 타입

토큰의 타입을 의미한다. JWT다.

2. alg : 해싱 알고리즘

해싱 알고리즘을 알려주는 것이다.
signature 부분에서 header, payloadsecret 키를 넣어서 합쳐버린다. 이때 alg에 작성되어 있는 알고리즘을 이용하여 합친다.

Payload

페이로드는 claim들이 담겨 있다. 이들은 name/value 쌍으로 구성되어 있다.

클레임은 크게 3종류로 나뉜다.

  1. 등록(registered) 클레임
  2. 공개(public) 클레임
  3. 비공개(private) 클레임

등록 클레임

다음과 같은 클레임들이 있으며, 모두 optional이기 때문에 골라 사용하면 된다.

출처 : https://velopert.com/2389

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

공개 클레임

공개 클레임은 충돌 가능성을 제거한 이름을 갖고 있어야 한다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓는다.

{
    "https://vagabondms.com/jwt_claims/is_admin": true
}

비공개 클레임

클라이언트와 서버 간에 합의에 의해 사용되는 클레임이다.

{
    "userId": "1",
    "username": "Minseok Kim"
}

Signature

서명은 헤더를 인코딩한 값, 페이로드를 인코딩한 값을 합쳐, 주어진 비밀키로 해쉬하여 생성한다.

그리고 이 모든 것을 합치면 토큰이 완성된다.

0개의 댓글