Jwt 토큰은 Json Web Token의 약자입니다. 말그대로 Json 포맷 데이터를 가지고 있는 토큰입니다.
Jwt 토큰은 3가지 형태로 나누어저 있는데 , header, payload, signature 지금은 Node에서 어떻게 Jwt 토큰을 다루는지에 대해서 학습하겠습니다.!!!
Header
{
"typ": "JWT",
"alg": "HS256"
}
- 타입은 JWT
- 해싱 알고리즘은 HS256을 사용합니다. (단방향 해시라고 하는데요 보통 암호화에 많이 사용합니다 데이터베이스에 비빌번호 그자체를 저장하는 것보단 단방향 해시를 사용해서 저장을 많이합니다!)
Payload
iss : 토큰 발급자 (issuer)
sub : 토큰 제목 (subject)
aud : 토큰 대상자 (audience)
exp : 토큰의 만료시간 (expiration) / 형식은 NumericDate
nbf : Not Before 을 의미 / 토큰의 활성 날짜
- 이외의 public, private 암호화 코드가 있습니다.
Signature
HMACSHA256(
base64UrlEncode(header)
+ "."
+ base64UrlEncode(payload),
secretkey)
- Header + Payload + Signature 정보를 사용하여 유일한 문자열을 만들어냅니다. 이토큰이 JWT토큰입니다.
자 Node.js에 적용해보겠습니다. npm 으로 필요한 패키지를 다운로드 해줍니다.
npm install rand-token
npm install jsonwebtoken
config 파일을 설정합니다. 이값은 JWT 토큰에서 서버쪽에서만 가지고 있어야하는 값이기 때문에 다른사람에게 노출되면 안됩니다.
jwtCong.js
const jwtConfig = {
secretKey : 'JwTtOkEnTeSt',
options : {
algorithm : "HS256",
expiresIn : "60m",
issuer : "issuer"
}
}
module.exports = jwtConfig;
- JSON 형태로 jwt토큰의 개인 설정들을 해줍니다. 이 때 secreKey는 서버쪽에서만 알고잇어야하는 prviate한 값입니다.
- 저는 설정을 JSON형태로 하였는데 파일형식은 상관없습니다! (js에서 json이 다루기 쉬워서 사용)
함수를 만듭니다. 이 함수는 두개의 기능을 합니다.
sign : jwt 생성
verify: 유효성 검증 및 유효하다면 jwt payload값 추출
const randToken = require('rand-token');
const jwt = require('jsonwebtoken');
const secretKey = require('../config/jwtConfig').secretKey;
const options = require('../config/jwtConfig').options;
module.exports = {
sign: async (info) => {
const payload = {
id: info.id,
nickname: info.nickname,
userImage: info.userImage,
type: info.type,
};
const result = {
token: jwt.sign(payload, secretKey, options),
refreshToken: randToken.uid(256)
};
return result;
},
verify: async (token) => {
let decoded;
try {
decoded = jwt.verify(token, secretKey);
} catch (error) {
if(error.message === 'jwt expired') {
console.log('유효기간 완료 토큰 입니다.');
} else if(error.message === 'invalid token') {
console.log('유효하지 않은 토큰입니다.');
} else {
console.log('유효하지 않은 토큰입니다.');
}
}
return decoded;
}
}
메인 컨트롤러에서 다음과 같이 사용합니다.
const jwt = require('../modules/jwt');
router.get(`/`, async (req, res) => {
const jwtToken = await jwt.sign(/*info 값*/);
const verify = await jwt.verify(jwtToken.token);
res.send(jwtToken.token +" "+ verify);
};
다음을 실행하면 다음과 같이 jwtToken 값과 인증되 Object 결과를 얻을 수가 있습니다.
그러면 이 토큰값을 쿠키로 보내서 클라이언트에게 저장하고있다가 유효한 인증이 필요한 경우 header에 jwt토큰을 보내면 끝입니다!
'TOPIC' 카테고리의 다른 글
쿠버네티스 : 서버를 관리한다는 것 (0) | 2022.01.27 |
---|---|
js로 현재파일의 모든폴더 조회하고 이동링크 파일 생성하기 (0) | 2021.12.10 |
React 프로젝트에 Redux 적용하기 : Redux란?? (0) | 2021.08.02 |
Node.js : Oauth 로그인 연동 (카카오 로그인, 구글 로그인) (2) | 2021.08.01 |
SVG (0) | 2021.07.29 |