// npm i jsonwebtoken
const jwt = require('jsonwebtoken');
// 토큰 생성, 시크릿 키: 'my-secret-key'
const token = jwt.sign({ test: true }, 'my-secret-key');
console.log(token);
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXN0Ijp0cnVlLCJpYXQiOjE2NDAxNzI3NTN9._Nu27p4dDeGdvjncA_mBFZFEYNxWVeuGdkK2DJzdG1Y
// 복호화
const decoded = jwt.decode(token)
console.log(decoded)
// { test: true, iat: 1640173279 }
// 정상적인 토큰인지 검증
const verify = jwt.verify(token,"my-secret-key")
console.log(verify)
// { test: true, iat: 1640173279 }
// 만약 시크릿키가 정상적이지 않다면 error 발생
// 머리(HEADER).가슴(PAYLOAD).배(VERIFY SIGNATURE) 로 생성이되며
// jwt.io에서 해당 token을 입력해 보면
// 가슴(payload)에 해당 데이터인 {"test": true} 을 담고 있다.
// 누구나 해당 사이트에서 Encoded(복호화)를 통해 데이터를 확인할 수는 있지만
// 변조가 불가능하며
// 배(VERIFY SIGNATURE)에 시크릿키(여기서는 "my-secret-key")를 입력해야
// 해당 데이터가 정상적인 토큰인지 signature verified 할 수 있다.
header.payload.signature
의 형식으로 3가지의 데이터를 포함 (개미처럼 머리, 가슴, 배).
이 포함된 데이터https://jwt.io/ 에서 간단히 확인가능
데이터를 교환하고 관리하는 방식인 쿠키/세션과 달리, JWT는 단순히 데이터를 표현하는 형식
프로젝트로 이용할 폴더를 생성하고, 모듈을 설치
npm init
npm i jsonwebtoken -S
const jwt = require("jsonwebtoken");
const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
console.log(token);
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0fQ.6XFgtNglH9hIzz5y8jAcI0g5kDnlAvnTTbxKIcL2CHY
코드로 복호화해서 출력
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0fQ.6XFgtNglH9hIzz5y8jAcI0g5kDnlAvnTTbxKIcL2CHY";
const decodedValue = jwt.decode(token);
앞서 말했듯이 JWT는 누구나 복호화가 가능
그러나 검증을 통해 변조가 되지 않은 데이터인지 확인 가능
복호화가 아닌, 변조되지 않은 데이터인지 검증
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0fQ.6XFgtNglH9hIzz5y8jAcI0g5kDnlAvnTTbxKIcL2CHY";
const decodedValue = jwt.verify(token, "myesecretkey");
만약 변조된 코드라면 위의 코드에서 에러가 발생
jwt.io 에서 복호화하여 확인가능