웹 풀스택

[Node.js] JWT 개념과 Node.js에서 사용해보기

kevinmj12 2025. 3. 1. 18:14

JWT

JWT란 JSON Web Token의 약자로 JSON 형태의 데이터를 안전하게 전송하기 위해 사용되는 토큰이다.

JWT는 주로 클라이언트가 서버와 통신을 하기 위해 사용되며 쿠키와 세션의 단점을 보완한다.

암호화가 되어있기 때문에 보안이 좋고, 서버가 상태를 저장하지 않는 Stateless이기 때문에 쿠키의 장점과 세션의 장점을 모두 가졌다.

 

https://jwt.io/

위 사이트에서 왼쪽에 있는 문자열이 암호화된 JWT이다.

오른쪽에 있는 것은 복호화된 JWT이며 JWT는 HEADER, PAYLOAD, SIGNATURE로 구성되어있다.

HEADER는 암호화할 때 사용한 알고리즘 정보, PAYLOAD는 정보를 담고 있는 부분, SIGNATURE는 서명이다. 

 

최초에 클라이언트가 서버로 요청을 보내면 서버에서 JWT를 생성하여 서명한 뒤 응답과 함께 클라이언트에 보낸다.

이후에 클라이언트는 서버로 요청을 보낼 때 마다 전달받았던 JWT를 함께 서버에 전송한다.

서버는 받은 JWT가 본인이 서명한 것이 맞는지 확인한 후 클라이언트의 요청을 받아들인다.

 

Node.js에서 JWT 사용해보기

https://www.npmjs.com/package/jsonwebtoken

 

jsonwebtoken

JSON Web Token implementation (symmetric and asymmetric). Latest version: 9.0.2, last published: 2 years ago. Start using jsonwebtoken in your project by running `npm i jsonwebtoken`. There are 32799 other projects in the npm registry using jsonwebtoken.

www.npmjs.com

npm install jsonwebtoken

먼저 jsonwebtoken을 설치해준다.

var jwt = require("jsonwebtoken");
var token = jwt.sign({ foo: "bar" }, "shhhhh");

jwt는 require("jsonwebtoken")을 통해 만들 수 있고, token은 jwt에 sign(서명)을 하여 만들 수 있다.

이 때 token을 만드는 것은 jwt 서명을 했다는 의미이고 SHA256으로 암호화된다.

실제로 위 token을 출력해보면, eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE3NDA4MTc2NDZ9.H6O79X36UBtydRa6lQ_6yJ45cJ-op5mecwAKdahT5Hg

로 암호화된 문자열이 출력된다.

이 값을 jwt.io에 넣고 SECRET란에 서명에 사용했던 "shhhhh"를 입력하면 성공적으로 복호화되어 결과가 나온다.

물론, Node.js에서도 복호화를 할 수 있다.

참고로 iat는 issued at의 약자로 토큰이 발행된 시간(초)이다.

 

var jwt = require("jsonwebtoken");
var token = jwt.sign({ foo: "bar" }, "shhhhh");

console.log(token);

var decoded = jwt.verify(token, "shhhhh");
console.log(decoded);

Node.js에서는 jwt.verify()를 통하여 서명을 입력하고 jwt를 복호화할 수 있다.

위에서는 서명으로 "shhhhh"를 사용하였지만, 보안을 위해서는 더 안전한 문자열을 사용하고 .env를 통해 관리해야 할 것이다.

 

var token = jwt.sign({ foo: "bar" }, JWT_SIGN, {
  expiresIn: "30m",
  issuer: "minje",
});

추가로 서명 뒤에 expiresIn과 issuer를 통해 만료 시간과 서명인을 간단하게 추가할 수 있다.