SHA-256
header.payload.signature
의 형식으로 3가지의 데이터를 포함.
이 포함header
: signature
에서 어떤 암호화를 사용하여 생성된 데이터인지 표현payload
: 개발자가 원하는 데이터를 저장signature
: 이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와줌쿠키
는 서버에서 전달 받은 것을 다음 서버에 자동적으로 전송
세션
은 서버로부터 열쇠를 발급 받아 서버에 있는 자물쇠를 열음
쿠키
,세션
데이터를 교환 및 관리JWT
단순히 데이터를 표현하기 위해암호화
및압축
하는 형식
JWT로 만든 데이터를 브라우저로 보내도 쿠키처럼 자동으로 저장되지는 않지만, 변조가 거의 불가능하고 서버에 데이터를 저장하지 않기 때문에 서버를 Stateless(무상테)
로 관리
Stateless
= 무상태
Node.js 서버가 언제든 죽었다 살아나도 똑같은 동작을 함Stateful
= 상태보존
서버가 죽었다 살아났을 때 조금이라도 동작이 다른 경우
ex) 로그인 정보를 서버에 저장하는 경우
가정) 쿠키안에 JWT를 전달 받았다
서버가 꺼졌다 켜저도 JWT 안의 정보들은 없어지지 않는다
= 서버가 똑같은 동작을 함
= JWT에 대한 내용은 Stateless 함
따라서 동일한 데이터를 서버로 전송할 수 있음
jsonwebtoken
라이브러리 사용npm init
npm i jsonwebtoken -S
const jwt = require("jsonwebtoken");
const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
console.log(token);
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2NzE1OTI1OTJ9
.mJYi7NPBWt9WPLDy42dNy4lPDChsWwDHjs6Yem8avFg
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValue = jwt.decode(token);
{ myPayloadData: 1234, iat: 1671594354 }
const jwt = require("jsonwebtoken");
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2Njc1NjE0NDB9.nvYSsLsT8jp7IfkbB2seCNeuLqRBgrrzDjKRFXjvoUE";
const decodedValueByVerify = jwt.verify(token, "mysecretkey");
{ myPayloadData: 1234, iat: 1671594354 }
만약 변조된 코드라면 에러가 발생
JsonWebTokenError: invalid signature
const token = jwt.sign(
{ myPayloadData: 1234 },
"mysecretkey",
{expiresIn: new Date().getMinutes() + 1}
);
{ myPayloadData: 1234, iat: 1671594612, exp: 1671594663 }
최종
async function main() {
// 암호화
const jwt = require("jsonwebtoken");
const token = jwt.sign(
{ myPayloadData: 1234 }, // jwt를 이용해서 payload 설정하는 부분
"mysecretkey", // jwt를 이용해서 암호화를 하기 위한 비밀 키
// { expiresIn: new Date().getMinutes() + 1 } // 만료 시간 지정
{ expiresIn: "1s" } // 만료 시간 지정 // expiresIn은 string, number형을 받을 수 있음
);
// console.log(token);
setTimeout(() => {
// 복호화
const decodeToken = jwt.decode(token); // jwt의 Payload를 확인하기 위해서 사용
// console.log(decodeToken);
// 비밀 키 검증
// 1. 암호화를 할 때 사용한 비밀키가 일치하는지 검증
// 2. 해당하는 jwt가 만료되었는지 검증
const verifyToken = jwt.verify(token, "mysecretkey");
console.log(verifyToken);
}, 1500); // 1.5초 뒤 실행
}
쿠키에 jwt를 전달받은 다음, 서버 요청 시 req부분에 자동적으로 쿠키가 할당 되도록 함
보통 암호화 된 데이터는 클라이언트(브라우저)가 전달받아 다양한 수단(
쿠키
,로컬스토리지
등)을 통해 저장하여 API 서버에 요청을 할 때 서버가 요구하는 HTTP 인증 양식에 맞게 보내주어 인증을 시도합니다!
실제 사용 용도