jsonwebtoken

하주영·2024년 4월 29일

node.js

목록 보기
10/15

jsonwebtoken은 jwt을 발행하고 검증하는 모듈이다.

JWT

JSON Web Token(JWT)는 인증과 권한이 필요한 정보 교환등에 사용되는 서명된 토큰 방식이다.
(활용 예시)

  • 로그인 시 토큰 발행
  • 권한이 필요한 API 요청 시 토큰을 주고 받으며 서비스 접근을 허용한다.

장점

  • 보안이 비교적 좋다.
  • 서버가 상태를 저장하지 않는다. -> stateless -> restful

JWT 구조

jwt는 3부분으로 나누어져 있다.

  • Header
  • Payload
  • Signature

형식: xxxxx.yyyyy.zzzzz

헤더는 2개의 부분으로 구성되어있다.

  • 해시 알고리즘 종류와 토큰의 타입
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

페이로드는 클레임을 포함하고 잇다.
클레임이란 엔터티(대게 사용자 정보) 및 추가적인 정보이다.

  • 등록된 클레임
    필수는 아니지만 권장되는 미리 정의된 클레임들 (3글자)
    • iss: 발행인
    • exp: 만료시간
    • sub: 주제
    • iat: 토큰 발행 시간
    • 등등
  • 사용자 정의 클레임
    등록된 클레임 외에 직접 추가할 수 있다.
    • id, email 등등

⭐ 하지만 Payload에는 민감한 정보를 담지 않아야 한다.
사실 Header와 Payload는 완벽한 암호화가 아니기 때문에 누구나 jwt를 가지고 알아낼 수 있는 값이다.

서명을 넣지 않아도 Header와 Payload값이 드러난 것을 볼 수 있다.

⭐⭐ 생성된 토큰은 변조로부터 보호되지만 누구든 읽을 수 있다.
따라서 민감한 비밀 정보를 넣으면 안된다.

Signature

서명은 메세지가 도중에 변하지 않았는지 확인하는 데 사용된다.
즉 복호화 과정에서 사용된다.

설치하기

npm i jsonwebtoken

시작하기

  • 암호화: jwt.sign(페이로드, 프라이빗키, 옵션)
  • 복호화: jwt.verify(토큰, 프라이빗키)
import jwt from "jsonwebtoken";

const app = express();
const port = 8000;

app.get("/login", (req, res) => {
  const payload = { id: "id", email: "id@email.com" };
  const secretKey = "shhhh";
  const token = jwt.sign(payload, secretKey, { expiresIn: "1m" });

  res.cookie("token", token);

  return res.status(200).json({ message: "로그인 완료" });
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

옵션

payload에 담길 클레임을 지정하는 옵션이다.
아무 옵션도 달지 않았을 경우 기본적으로 iat(발행시간)만 지정된다.

{
  "id": "id",
  "email": "id@email.com",
  "iat": 1714380499
}

추가적으로

  • algorithm : 해시 알고리즘 (디폴트 값: HS256)
  • expiresIn : 만료 시간 (ex)"1h", "30m"
  • issuer : 발행인
  • subject : 주제
  • noTimestamp : 만료 시간을 payload에서 제거
    등을 포함할 수 있다.

복호화

  • 암호화 키와 같은 키로 복호화 해야한다.
const decoded = jwt.verify(token, secretKey); // 복호화

참고문서
https://jwt.io/introduction
https://brunch.co.kr/@jinyoungchoi95/1

0개의 댓글