JSON Web Token (JWT)
http://jwt.io/
- Restful API 설계과정에서 토큰 인증방식 고민하다가 보게된 JWT
구조는 아주 심플하고 간단함

1. 토큰 데이터의 구조
⇒ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0MTIzMTIzNTQzNTM0NTY3ODkwIiwibmFtZSI6IkpvaDM0NTM0NTM0NW4gRG9lIiwiYWRtaW4iOnRydWV9.gUpPTlD6M3F264lbRyXa6lat7t1tqoP3MHOwFX1qies
1) 첫번째 인자 서명키 생성 방식에 대한 정보 (header)
⇒ base64인코딩한 { "alg": "HS256", "typ": "JWT" }
: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2) 두번째 인자 실제 데이터 정보 (payload)
⇒ base64인코딩한 { "sub": "1234123123543534567890", "name": "Joh345345345n Doe", "admin": true }
: eyJzdWIiOiIxMjM0MTIzMTIzNTQzNTM0NTY3ODkwIiwibmFtZSI6IkpvaDM0NTM0NTM0NW4gRG9lIiwiYWRtaW4iOnRydWV9
3) 세번째 인자 데이터에 대한 무결성 / 변조 방지를 위한 HMAC
⇒ HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),ServerkeyData)
: gUpPTlD6M3F264lbRyXa6lat7t1tqoP3MHOwFX1qies
2. node.js 구현
- https://github.com/auth0/node-jsonwebtoken
※ 기타 언어 라이브러리 참고 http://jwt.io/#libraries
1) npm 설치
$ npm install jsonwebtoken
jsonwebtoken@5.0.2 node_modules/jsonwebtoken
└── jws@3.0.0 (jwa@1.0.0, base64url@1.0.4)
2) jwt 토큰 생성 및 실행
var jwt = require('jsonwebtoken');
var tokenKey = "TEST_KEY11"; //토큰키 서버에서 보관 중요
var payLoad = {'uid':14554};
var token = jwt.sign(payLoad,tokenKey,{
algorithm : 'HS256', //"HS256", "HS384", "HS512", "RS256", "RS384", "RS512" default SHA256
expiresInMinutes : 1440 //expires in 24 hours
});
console.log("token : ", token);
$ node jwt_test.js
token : eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjE0NTU0LCJpYXQiOjE0MzUxMzA4NzMsImV4cCI6MTQzNTIxNzI3M30.EWNUjnktCWxlqAAZW2bb0KCj5ftVjpDBocgv2OiypqM
2) jwt 토큰 디코딩
var jwt = require('jsonwebtoken');
var tokenKey = "TEST_KEY11"; //토큰키 서버에서 보관 중요
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjE0NTU0LCJpYXQiOjE0MzUxMzA4NzMsImV4cCI6MTQzNTIxNzI3M30.EWNUjnktCWxlqAAZW2bb0KCj5ftVjpDBocgv2OiypqM';
//비동기처리
jwt.verify(token,tokenKey,function(err,decoded){
console.log("sync : ", decoded);
});
//동기처리
try {
var decoded = jwt.verify(token,tokenKey);
console.log("async : ", decoded);
} catch(err){
console.log(err);
}
$ node jwt_test_decoded.js
async : { uid: 14554, iat: 1435130873, exp: 1435217273 }
sync : { uid: 14554, iat: 1435130873, exp: 1435217273 }
//실행은 sync가 먼저 되었지만 비동기 방식이므로 더 뒤에 출력됨
참고사이트
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
http://bcho.tistory.com/999
http://bcho.tistory.com/1000