반응형
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는 서명이 담겨있다.
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 |