token 인증방식

2025. 5. 15. 11:12Coding Study/Node.js

토큰 인증 방식이란?

토큰은 쉽게 말해 입장권이나 출입증과 같은 인증 수단이다. 클라이언트가 서버로부터 인증을 받으면 서버는 토큰을 발급해주고, 클라이언트는 이 토큰을 들고 다니며 서버에 요청할 때마다 제출함으로써 인증을 대신하게 된다.

 

JWT (JSON Web Token) 소개

 

웹에서 많이 사용하는 토큰 방식 중 하나는 JWT 이다.
JWT는 JSON 형태의 데이터를 담고, 이를 인코딩하여 만든 토큰이다. 이 토큰은 총 3개의 구성 요소로 이루어져 있다.

1. Header (헤더)

  • 토큰의 타입 (typ)과 알고리즘 정보 (alg)가 담겨 있다.
  • 예시:
{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload (페이로드)

  • 사용자 정보나 토큰에 담을 데이터가 들어간다.
  • 예시:
{
  "name": "John Doe",
  "iat": 1718572800
}

 

3. Signature (서명)

  • 헤더 + 페이로드를 Base64로 인코딩하고, 여기에 서버만 알고 있는 secret key를 더해 암호화한 값이다.
  • 이 값이 기존의 시그니처와 일치하면 토큰의 무결성을 확인할 수 있다.

 

 

<토큰에 들어가는 값>

 

 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ0ZXN0IiwiaWF0IjoxNzQ3MjgyNjQxLCJleHAiOjE3NDc4ODI2

                      Header                                                                           payload

 

NDF9.BIsnShYyGRK5Yf54CWFV53TLUShGn_pjX9mab-2dEHU

                           signiture

 

 

 

클라이언트에서 get 요청을 보내면 가지고 있던 쿠키정보도 같이 전달되며 서버에서 Header와 Payload 값을 인코딩한 값에서

Secret을 더해 암호화 하는데 이값이 signature 값과 동일 해야 한다.

 

JWT 생성 및 검증 원리

  1. 서버는 사용자 인증 후 JWT를 생성한다.
  2. 헤더와 페이로드를 Base64로 인코딩한다.
  3. 여기에 서버만 알고 있는 secret을 추가하여 시그니처를 만든다.
  4. 이렇게 만든 header.payload.signature 조합이 최종 JWT가 된다.
  5. 서버는 JWT를 검증할 때, 받은 토큰의 헤더와 페이로드를 재조합하고 secret으로 시그니처를 다시 생성한다.
  6. 생성된 시그니처와 토큰의 시그니처가 일치한다면 유효한 토큰으로 간주한다.

액세스 토큰과 리프레시 토큰

토큰은 주로 아래 두 가지로 나뉜다.

  1. 액세스 토큰

  • 사용자의 인증 상태를 증명하기 위한 토큰이다.
  • 만료 기간이 짧게 설정되어 있으며, 클라이언트는 이 토큰을 서버에 요청할 때마다 함께 보낸다.

  2. 리프레시 토큰

  • 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용된다.
  • 리프레시 토큰까지 유출되면 심각한 보안 문제로 이어질 수 있으므로, 더 엄격하게 관리해야 한다.

모듈설치 (서버)

npm i jsonwebtoken

 

불러와서 사용하기 (서버)

const jwt = require('jsonwebtoken');

 

 

 

방법 1 : cookie 에 token 을 넣어서 전달

 

 

 

 

방법 2 :  token을 변수에 저장(주황색  변경 내용)

 

 

 

jwt.sign 으로 토큰 발급

기본형식

const jwt = require('jsonwebtoken');

const token = jwt.sign(payload, secretOrPrivateKey, [options]);

 

매개변수 설명
payload 토큰에 담고 싶은 데이터 (예: 사용자 ID, 이메일 등)
secretOrPrivateKey 서명에 사용할 비밀 키 (서버에서만 알고 있어야 함)
options (선택) 토큰의 만료 시간, 알고리즘 등의 옵션 설정

 

<사용예시>

const accessToken = jwt.sign({ userId: userInfo.user_id }, secretKey, {
      expiresIn: 1000 * 60 * 10,
    });

secretKey : 인증 검증용 키 ( .env에 저장해서 불러온다 )

expiresIn : ms 단위로 작성하면 유효기간을 설정 가능 하다. (1000*60*10 --> 10분으로 설정됨)

 

 

 

 

 

 

 

jwt 공식 사이트

https://jwt.io/

 

JSON Web Tokens - jwt.io

JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).

jwt.io

 

 

 

Base64 디코딩 사이트

https://www.base64decode.org/ko/

 

Base64 디코딩 및 인코딩 - 온라인

Base64 형식에서 디코딩해보세요. 아니면 다양한 고급 옵션으로 인코딩해보세요. 저희 사이트에는 데이터 변환하기에 사용하기 쉬운 온라인 도구가 있습니다.

www.base64decode.org

 

 

'Coding Study > Node.js' 카테고리의 다른 글

카카오 로그인 기능 구현  (0) 2025.05.16
OAuth 인증  (0) 2025.05.16
Session  (0) 2025.05.14
cookie  (0) 2025.05.14
express / axios  (0) 2025.05.13