JSON Web Token (JWT)
- 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)
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/