node.js에서 jwt 로그인 구현하기

기본 개념

JWT란?

Jason Web Token

토큰 데이터의 구조

실제 토큰=>

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0MTIzMTIzNTQzNTM0NTY3ODkwIiwibmFtZSI6IkpvaDM0NTM0NTM0NW4gRG9lIiwiYWRtaW4iOnRydWV9.gUpPTlD6M3F264lbRyXa6lat7t1tqoP3MHOwFX1qies

각 부분은 .를 기준으로 3 파트로 나뉜다.

첫번째 파트 => 서명키 생성 방식에 대한 정보 (header)

1
2
3
4
5
{
"alg":"HS256",
"type":"JWT"
}
=> eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

두번째 파트 => 실제 데이터 정보 (payload)

1
2
3
4
5
6
{
"sub": "1234123123543534567890",
"name": "Joh345345345n Doe",
"admin": true
}
=> eyJzdWIiOiIxMjM0MTIzMTIzNTQzNTM0NTY3ODkwIiwibmFtZSI6IkpvaDM0NTM0NTM0NW4gRG9lIiwiYWRtaW4iOnRydWV9

세번째 파트 => 데이터에 대한 무결성 / 변조 방지를 위한 HMAC
HMACSHA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload),ServerkeyData)
=> gUpPTlD6M3F264lbRyXa6lat7t1tqoP3MHOwFX1qies

준비사항

  1. jsonwebtoken 설치
    npm install jsonwebtoken

Work Flow

  1. 회원가입 요청 => 서버에 id와 password 전달
  2. 서버에서 받은 email을 토대로 중복여부 판별
  3. 중복되지 않았다면 db에 jwt토큰을 복호화 하기 위한 secret key를 저장(random generate)
  4. 위의 secret key를 db에 저장
  5. 사용자가 로그인 시도하면 해당 secret key를 검색하여 토큰을 복호화하여 전달한 토큰과 일치하는지 확인하여 토큰을 전달한다.
  6. 받은 토큰을 사용자는 로컬에 저장한다.

Process

모듈 불러오기

const jwt = require('jsonwebtoken')

jasonwebtoken으로 토큰 발급하기

jwt.sign(payload, secret, options, [callback])
만약에 callback 이 전달되면 비동기적으로 작동하며, 콜백함수의 파라미터는 (err, token) 입니다.
전달되지 않을시엔 동기적으로 작동하며, JWT 를 문자열 형태로 리턴합니다.
payload 는 객체, buffer, 혹은 문자열형태로 전달 될 수있습니다.
secret 은 서명을 만들 때 사용되는 알고리즘에서 사용되는 문자열 혹은 buffer 형태의 값 입니다.

1
2
3
4
var token = jwt.sign(payLoad,tokenKey,{
algorithm : 'HS256', //"HS256", "HS384", "HS512", "RS256", "RS384", "RS512" default SHA256
expiresInMinutes : 1440 //expires in 24 hours
});

토큰 복호화 하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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를 설치하고 이용한다.

NPM 참고자료


라즈베리 파이 시작하기 심리학 개론

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×