Jwt 토큰은 Json Web Token의 약자입니다. 말그대로 Json 포맷 데이터를 가지고 있는 토큰입니다.
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
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 |