JWT(Json Web Token)은 웹 표준으로써, 서버와 클라이언트 사이에서 정보를 안전하게 전송하기 위해 도움을 주는 웹 토큰(Web Token)이다. 예를들어 우리가 만든 소중한 정보들을 암호화된 json 형태의 토큰을 문장으로 발급하고, 정보가 필요한 때에는 토큰이 필요하게 만드는 것.
JWT(Json Web Token)는 크게 세 부분, 헤더(Header), 페이로드(Payload), 서명(Signature)로 구성되어 있다.
위의 머리부분인 헤더(header)는 토큰의 타입과 어떤 암호화를 사용하여 생성된 데이터인지 정의되어 있다.
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
그리고 마지막 서명부분은 헤더와 페이로드, 그리고 비밀 키(Secret Key)를 이용하여 생성된다. 이 서명은 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와줌
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
만약 jwt 비밀 키를 모르더라도 jwt를 가진 사람이라면 누구나 해당 토큰에 어떤 데이터가 있는지 복호화(Decode)를 통해 확인 할 수 있다.
- 변조만 불가능 할뿐, 누구나 복호화하여 보는것은 가능하다. 따라서 개인정보나, 비밀번호 같은 민감한 정보는 담지 않도록 해야 한다.
데이터를 교환하고 관리하는 방식인 쿠키/세션과 달리, JWT는 단순히 데이터를 표현하는 형식이다. 따라서 JWT로 만든 데이터는 변조가 어렵고, 서버에 별도의 상태 정보를 저장하지 않기 때문에, 서버를 Stateless(무상태)로 관리할 수 있음.
먼저 프로젝트로 이용할 폴더를 생성한 뒤 아래 명령어로 필요한 모듈을 설치한다.
yarn init -y yarn add jsonwebtoken express그 후 yarn을 이용해 생성된 package.json 파일에서 type을 module로 꼭 변경해준다.
import jwt from 'jsonwebtoken';
const token = jwt.sign({ myPayloadData: 1234 }, 'mysecretkey');
console.log(token);

import jwt from "jsonwebtoken";
const token =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjE3NSwiZW
1haWwiOiJ5b3NoOTdAbmF2ZXIuY29tIiwibmFtZSI6IuuwlOuztCIsImlhdCI6M
TcyNjI0Mjc2NywiZXhwIjoxNzI2MjQ5OTY3fQ.XFlAgHauk-xUMqhtA-Z-4PqtuaFSW6JkC66ctFOHdv8";
const decodeValue = jwt.decode(token);
console.log(decodeValue);
위와같이 반대로 복호화된 토큰을 가지고 decode 메서드를 사용하면 아래와 같이 안의 정보들을 확인 할 수 있다.

import jwt from "jsonwebtoken";
const token =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e
yJ1c2VySWQiOjE3NSwiZW1haWwiOiJ5b3NoOTdAbmF2ZX
IuY29tIiwibmFtZSI6IuuwlOuztCIsImlhdCI6MTcyNjI0NDIxNyw
iZXhwIjoxNzI2MjUxNDE3fQ.K-7CEC9hmlitk0v78BiA0TJdANwlnESOAbVxsCpw2fA";
const decodedValueByVerify = jwt.verify(token, "secretKey");
console.log(decodedValueByVerify);
그럼 decode했던 것과 같이 토큰 검증이 완료되면서 아래의 데이터 정보가 출력되게 된다 !

이처럼 jwt는 두 가지 중요한 특징을 가지고 있다.
1. JWT가 인증 서버에서 발급되었는지 위변조 여부를 확인할 수 있고,
2. 누구든지 복호화를 통해 JWT 내부에 들어있는 정보를 확인할 수 있습니다.