JWT에 대한 이해

yujin·2023년 11월 8일
0

TIL

목록 보기
6/48
post-thumbnail

JWT에 대한 이해


1. JWT(JSON Web Token)란?

JWT는 웹 표준(RFC 7519)으로, JSON 객체를 사용하여 두 개체 사이에서 정보를 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의한다. 이는 디지털 서명을 통해 검증과 신뢰성이 가능하다.

2. JWT의 내부 구조

2-1. 헤더(Header)

헤더는 token의 타입과 알고리즘 정보를 담고 있다.

{
  "alg": "HS256",
  "typ": "JWT"
}

alg는 해싱 알고리즘을 나타내며, typ는 token의 타입을 나타낸다.

2-2. 페이로드(Payload)

페이로드는 전송할 실제 정보(클레임)을 담고 있다.
클레임은 token에 포함된 정보의 한 조각으로 token 사용자에게 특정 권한을 부여하거나, 사용자의 상태 등을 나타낸다.
클레임은 등록된(Registered), 공개(Public), 비공개(Private) 세 종류가 있다.

{
  "userId": "1234",
  "role": "admin"
}

2-3. 시그니처(Signature)

시그니처는 헤더와 페이로드를 이용해 생성되며, 이를 통해 token의 무결성이 보장된다.
시그니처는 헤더의 인코딩 값과 페이로드의 인코딩 값을 합친 후, 비밀 키를 이용해 암호화하여 생성한다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

여기서 secret은 비밀 키를 나타낸다.

3. JWT의 장점

  • URL, HTTP 헤더 등에서 안전하게 전송될 수 있다.
  • 디지털 서명을 통해 Token의 무결성을 검증할 수 있다.

4. JWT의 단점

  • 한번 발급되면 수정이 불가능하므로, 만료 시간 등을 수정하고 싶을 때는 새로운 토큰을 발급해야 한다.
  • 페이로드(Payload) 부분은 Base64로 인코딩되어 있기 때문에 중요한 정보느 노출되지 않도록 주의해야 한다.

5. 예시 코드

// 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);
  }
});

etc

실제 프로젝트에서 사용하려면 보안 관련 이슈를 신경 써야한다는데 쓰려나 모르겠다.

profile
고통 받는 코딩일기

0개의 댓글