JWT 학습

JWT TOKEN 이란 ?

설명

JSON WEB TOKEN의 줄임말으로서
JSON 객체를 사용하고 가볍고 자가수용적인 방식으로 정보를 안정성있게 전달해줍니다.

자가 수용적입니다.
JWT 는 필요한 모든정보를 자체적으로 지니고 있습니다.
JWT시스템에서 발급된 토큰은 토큰에 대한 기본정보, 전달할 정보 (로그인 시스템에서는 유저정보)
그리고 토큰이 검증되었다는 것을 증명해주는 signature를 포함하고 있습니다.

사용처

EX)
회원인증
JWT를 사용하는 가장 흔한 시나리오.
클라이언트 > 로그인요청( ID, PW ) > 서버 > CONTROLLER( ID , PW ) > SERVICE ( ID , PW )
< (TOKEN) < (TOKEN) < (TOKEN)

서버가 클라이언트에게서 요청을 받을때 마다 해당 토큰이 유효하고 인증되었는지 검증을 하고 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리함

정보교류
JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법.
정보가 sign으로 되어있기때문에 정보를 보낸이가 바뀌지 않았는지, 조작되지 않았는지 검증할 수 있음.

JWT의 구조

JWT는 . 을 구분자로 3가지 문자열로 되어있습니다.

구조
헤더.내용.서명
aaaaa.bbbbbb.cccccc
헤더 , 내용 , 서명
header , payload, signature

헤더
Header는 두가지 정보를 지니고 있음
type : 토큰의 타입을 지정 == JWT
alg : 해싱 알고리즘을 지정함 , 보통 HMAC SHA256 혹은 RSA가 사용되며 이 알고리즘은 토큰을 검증할 때 사용되는 signature부분에서 사용됨

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

Node.js환경에서 인코딩하기

const  header= {
  "typ" :  "JWT" ,
  "alg" : "HS256"
}
//encode to base64 

const encodePayload = new Buffer(JSON.stringify(payload)).toString('base64').replace('=',' ');

console.log("payload: ",encodePayload );

/* result 
 *   header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
 */

정보 : Payload
Payload 부분에는 토큰에 담을 정보들이 들어 있습니다.
여기에 담는 정보의 한 '조각'을 클레임이라고 부르며 name/value의 한 쌍으로 이뤄져 있습니다.
토큰에는 여러개의 클레임들을 넣을 수 있습니다.

등록된 (registered)클레임
공개(public)클레임
비공개(private)클레임

1. 등록된 클레임 ( registered )
등록된 클레임들은 서비스에서 필요한 정보들이 아닌 토큰에 대한 정보들을 담기위해 이름이 이미 정해진 클레임들입니다.
등록된 클레임의 사용은 모두 선택적이며 이에 포함된 클레임의 이름들은 다음과 같습니다.
iss : 토큰 발급자
sub : 토큰 제목 ( issuer )
aud : 토큰 대상자 ( audience )
exp : 토큰의 만료시간 ( expiraton ) , 시간은 NumbericDate형식으로 되어 있어야 하며 ( ex : 1480849147370 ) 언제나 현재시간보다 이후로 설정 되어잇어야 합니다.
nbf : Not Before를 의미하며 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumbericDate형식으로 날짜를 지정하며 이 날짜가 지나가기전까지는 토큰이 처리되지 않습니다.
iat : 토큰이 발급된 시간 ( issued at) 이값을 사용하여 토큰의 age가 얼마나 되었는지 판단할 수 있습니다.
jti : JWT의 고유 식별자로서 , 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.

2. 공개 PUBLIC 클레임
공개 클레임들은 충돌이 방지된 (collision - resistant ) 이름을 가지고 있어야합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI형식으로 짓습니다.

{
	"http://velopert.com/jwt_claims/is_admin":true
}

3. 비공개 PRIVATE 클레임
등록된 클레임도 아니고 공개된 클레임도 아닙니다. 양 측( CLIENT <> SERVER) 협의하에 사용되는 클레임 이름들입니다.
공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.

{
    "username": "velopert"
}


예제--- Payload 
{
    "iss": "velopert.com",
    "exp": "1485270000000",
    "https://velopert.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "velopert"
}

좋은 웹페이지 즐겨찾기