node.js에서 jwt 로그인 구현하기
기본 개념
JWT란?
Jason Web Token
토큰 데이터의 구조
실제 토큰=>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0MTIzMTIzNTQzNTM0NTY3ODkwIiwibmFtZSI6IkpvaDM0NTM0NTM0NW4gRG9lIiwiYWRtaW4iOnRydWV9.gUpPTlD6M3F264lbRyXa6lat7t1tqoP3MHOwFX1qies
각 부분은 .를 기준으로 3 파트로 나뉜다.
첫번째 파트 => 서명키 생성 방식에 대한 정보 (header)
{
"alg":"HS256",
"type":"JWT"
}
=> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
두번째 파트 => 실제 데이터 정보 (payload)
{
"sub": "1234123123543534567890",
"name": "Joh345345345n Doe",
"admin": true
}
=> eyJzdWIiOiIxMjM0MTIzMTIzNTQzNTM0NTY3ODkwIiwibmFtZSI6IkpvaDM0NTM0NTM0NW4gRG9lIiwiYWRtaW4iOnRydWV9
세번째 파트 => 데이터에 대한 무결성 / 변조 방지를 위한 HMAC HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),ServerkeyData) => gUpPTlD6M3F264lbRyXa6lat7t1tqoP3MHOwFX1qies
준비사항
- jsonwebtoken 설치
npm install jsonwebtoken
Work Flow
- 회원가입 요청 => 서버에 id와 password 전달
- 서버에서 받은 email을 토대로 중복여부 판별
- 중복되지 않았다면 db에 jwt토큰을 복호화 하기 위한 secret key를 저장(random generate)
- 위의 secret key를 db에 저장
- 사용자가 로그인 시도하면 해당 secret key를 검색하여 토큰을 복호화하여 전달한 토큰과 일치하는지 확인하여 토큰을 전달한다.
- 받은 토큰을 사용자는 로컬에 저장한다.
Process
모듈 불러오기
const jwt = require('jsonwebtoken')
jasonwebtoken으로 토큰 발급하기
jwt.sign(payload, secret, options, [callback])
만약에 callback 이 전달되면 비동기적으로 작동하며, 콜백함수의 파라미터는 (err, token) 입니다.
전달되지 않을시엔 동기적으로 작동하며, JWT 를 문자열 형태로 리턴합니다.
payload 는 객체, buffer, 혹은 문자열형태로 전달 될 수있습니다.
secret 은 서명을 만들 때 사용되는 알고리즘에서 사용되는 문자열 혹은 buffer 형태의 값 입니다.
var token = jwt.sign(payLoad,tokenKey,{
algorithm : 'HS256', //"HS256", "HS384", "HS512", "RS256", "RS384", "RS512" default SHA256
expiresInMinutes : 1440 //expires in 24 hours
});
토큰 복호화 하기
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);
}
참조
nodejs에서 jwt를 사용하기 위한 npm package를 설치하고 이용한다.