[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/WEB

JWT (JSON Web Token)

inu 2021. 2. 3. 17:51
반응형

JWT (JSON Web Token)

  • JSON 객체를 사용하여 가볍고 자가수용적(self-contained)으로 정보를 전달한다. HTTP 헤더 혹은 URL의 파라미터로 두 개체 사이에서도 손쉽게 전달된다.
  • Java, Python, C++, PHP, JavaScript, Go, Swift 등 대부분의 주류 프로그래밍 언어에서 지원된다.
  • 자가수용적(self-contained)? 필요한 모든 정보를 자체적으로 지니고 있다. 자체적으로 기본정보, 전달정보, 서명(signature)를 포함한다.
  • 회원 인증을 하거나, 정보교류를 할 때 유용하게 사용된다. 토큰 내부에 검증증명이 포함되어 있기 때문에 이를 확연하여 인증정보 혹은 정보의 조작여부를 확인할 수 있다.
  • A.B.C와 같이 .을 구분자로 하여 3가지 문자열로 구성되어 있다. A는 헤더(기본정보), B는 전달정보, C는 서명이 담겨있다.

JWT의 예시 (Header(A).Payload(B).Signature(C))


A. 헤더(Header)

{
  "typ": "JWT",
  "alg": "HS256"
}
  • typ: 토큰의 타입을 지정한다. (JWT)
  • alg: 해싱 알고리즘을 지정한다. 보통 HMAC SHA256 혹은 RSA 가 사용된다. 해당 알고리즘은 토큰을 검증할 때 사용되는 signature 부분에 사용된다.
  • 해당정보를 base64로 인코딩하여 최종적인 헤더가 완성된다. (=>eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9, 공백 및 엔터는 제외하고 인코딩이 진행됨.)

B. 전달정보(payload)

  • 토큰에 담을 정보가 들어있는 부분인데, 여기서 정보의 한조각을 클레임(claim)이라고 부른다. 이는 name과 value쌍으로 구성되어 있다.
  • 토큰에는 여러개의 클레임(claim)이 들어있는데, 크게 3가지로 분류된다. (등록된 (registered) 클레임,공개 (public) 클레임,비공개 (private) 클레임)

등록된 (registered) 클레임

  • 서비스에 필요한 정보가 아닌 토큰에 대한 정보를 담기 위한 클레임으로, 이미 name이 정해져 있다.
  • 사용은 선택적이다.
iss 토큰 발급자 (issuer)
sub 토큰 제목 (subject)
aud 토큰 대상자 (audience)
exp 토큰의 만료시간 (expiraton)
nbf Not Before 를 의미
iat 토큰이 발급된 시간 (issued at)
jti JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용

공개 (public) 클레임

  • 충돌되지 않는 이름을 가지고 있어야하므로, URI를 name으로 갖는다.
{
    "https://inuplace.tistory.com/is_admin": true
}

비공개 (private) 클레임

  • JWT를 주고받는 상호간의 협의하에 사용되는 클레임으로, 공개 클레임과 달리 이름이 중복될 수 있다.
{
    "username": "inu"
}

최종 전달정보(payload) 예시

{
    "iss": "velopert.com",
    "exp": "1485270000000",
    "https://inuplace.tistory.com/is_admin": true,
    "userId": "11028373727102",
    "username": "inu"
}
  • 이렇게 완성된 데이터를 헤더와 마찬가지로 base64로 인코딩하여 최종적인 정보(payload)가 완성된다.

C. 서명 (signature)

  • 헤더의 인코딩값과 정보의 인코딩값을 합친 후 비밀키로 해쉬처리하여 생성한다.
  • 해쉬결과를 base64로 인코딩하여 최종적인 서명이 된다.

결론

  • 이렇게 완성된 A(헤더), B(전달정보), C(서명)가 합쳐져 최종적인 JWT가 된다.
  • 사실 JWT라이브러리에서 해당 작업들을 모두 처리해주기 때문에 직접 해싱 및 인코딩을 할 일은 없다.
  • 그래도 구조를 이해하기 위해 이정도는 알아두도록 하자.
반응형

'🛠 기타 > WEB' 카테고리의 다른 글

Nodejs - boilerplate  (0) 2021.04.16
Node.js - bcrypt  (0) 2021.02.04
서버기반 인증시스템과 토큰기반 인증 시스템  (0) 2021.02.03
Node.js - Passport.js 기초  (0) 2021.02.03
Node.js - session  (0) 2021.02.02