JWT에 대한 이해
JWT는 웹 표준(RFC 7519)으로, JSON 객체를 사용하여 두 개체 사이에서 정보를 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의한다. 이는 디지털 서명을 통해 검증과 신뢰성이 가능하다.
헤더는 token의 타입과 알고리즘 정보를 담고 있다.
{
"alg": "HS256",
"typ": "JWT"
}
alg
는 해싱 알고리즘을 나타내며, typ
는 token의 타입을 나타낸다.
페이로드는 전송할 실제 정보(클레임)을 담고 있다.
클레임은 token에 포함된 정보의 한 조각으로 token 사용자에게 특정 권한을 부여하거나, 사용자의 상태 등을 나타낸다.
클레임은 등록된(Registered)
, 공개(Public)
, 비공개(Private)
세 종류가 있다.
{
"userId": "1234",
"role": "admin"
}
시그니처는 헤더와 페이로드를 이용해 생성되며, 이를 통해 token의 무결성이 보장된다.
시그니처는 헤더의 인코딩 값과 페이로드의 인코딩 값을 합친 후, 비밀 키를 이용해 암호화하여 생성한다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
여기서 secret
은 비밀 키를 나타낸다.
// JWT 생성 및 검증 코드
const jwt = require('jsonwebtoken');
const secret = 'my_secret_key';
// JWT 생성
const token = jwt.sign({ user: 'userid' }, secret, { expiresIn: '1h' });
console.log(token);
// JWT 검증
jwt.verify(token, secret, (err, decoded) => {
if (err) {
console.log('JWT verification failed.');
} else {
console.log('JWT verification successful:', decoded);
}
});
실제 프로젝트에서 사용하려면 보안 관련 이슈를 신경 써야한다는데 쓰려나 모르겠다.