컴퓨터공학

JWT(JSON Web Token) 인증 방식 개념

nyambu 2025. 3. 18. 08:00

JWT(JSON Web Token) 인증 방식 개념
JWT(JSON Web Token) 인증 방식 개념

1. JWT란?

 JWT(JSON Web Token)는 웹 애플리케이션에서 사용자 인증 및 권한 부여를 위해 사용되는 토큰 기반 인증 방식이다. JWT는 서버에서 발급한 토큰을 클라이언트가 저장하고, 이후 요청 시 해당 토큰을 이용해 인증을 수행하는 방식으로 동작한다.

 

📌 JWT의 특징

  • 토큰 기반 인증 방식 → 서버가 세션을 저장할 필요 없음 (무상태성)
  • JSON 형식 사용 → 가볍고, 웹에서 쉽게 활용 가능
  • 디지털 서명 포함 → 토큰이 변조되지 않도록 보안 강화
  • 다양한 환경에서 사용 가능 → 웹, 모바일, 마이크로서비스 등

📌 JWT 인증 방식이 필요한 이유

  • 세션 기반 인증의 문제점 해결
  • 확장성 높은 인증 시스템 구축 가능
  • REST API와 잘 어울리는 인증 방식

2. JWT의 구조

JWT는 **세 부분(헤더, 페이로드, 서명)**으로 구성되며, 각각 Base64URL 인코딩되어 하나의 문자열로 결합된다.

 

📌 JWT 구조

HEADER.PAYLOAD.SIGNATURE

 

📌 예제 JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJ1c2VySWQiOjEsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNjk5MjM1MjAwLCJleHAiOjE2OTkyMzg4MDB9
.CWqTQGx9mE_J5JfdKzRJSmD-G1KgL2vT4UK9byJzv0w

 

2-1. Header (헤더)

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg: 서명에 사용할 알고리즘 (예: HS256)
  • typ: 토큰 타입 (항상 JWT)

2-2. Payload (페이로드)

{
  "userId": 1,
  "role": "user",
  "iat": 1699235200,
  "exp": 1699238800
}
  • userId: 사용자 ID
  • role: 사용자 역할 (예: admin, user)
  • iat: 토큰 발급 시간 (Issued At)
  • exp: 토큰 만료 시간 (Expiration)

2-3. Signature (서명)

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)
  • 서명(Signature)은 토큰 위변조 방지를 위해 사용됨
  • secretKey는 서버에서만 알고 있어야 함

3. JWT 인증 방식의 동작 과정

 JWT를 활용한 인증은 다음과 같은 단계를 따른다.

 

3-1. 로그인 요청

 사용자가 ID/PW로 로그인하면, 서버는 인증 후 JWT를 발급한다.

 

📌 클라이언트 → 서버 요청 (로그인)

POST /login
Content-Type: application/json

{
  "username": "user1",
  "password": "mypassword"
}

 

📌 서버 → 클라이언트 응답 (JWT 발급)

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

 

3-2. 요청 시 JWT 포함

 클라이언트는 이후 API 요청 시 JWT를 **HTTP 헤더(Authorization)**에 포함시켜 보낸다.

 

📌 JWT 포함 요청 (클라이언트 → 서버)

GET /user/profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

 

📌 서버에서는 JWT 검증 후 요청 처리

1. Authorization 헤더에서 JWT 추출
2. 서명을 검증하여 토큰의 유효성 확인
3. 토큰이 유효하면 요청을 처리

 

3-3. JWT 검증

서버는 **서명(Signature)**을 검증하여 토큰이 변조되지 않았는지 확인한다.

 

📌 JWT 검증 과정

  1. Header, Payload 분리
  2. 서버의 secret key를 사용하여 서명(Signature) 생성
  3. 요청된 JWT의 서명과 비교
  4. 일치하면 요청 처리, 불일치하면 인증 실패

 

📌 JWT 유효하지 않은 경우 응답

{
  "status": 401,
  "message": "Invalid token"
}

4. JWT의 장점과 단점

1) 장점

  • 무상태성(Stateless) → 서버가 세션을 저장할 필요 없음
  • 확장성(Scalability) 좋음 → 여러 서버에서 인증 가능
  • 빠른 인증 → 데이터베이스 조회 없이 토큰으로 인증 가능

2) 단점

  • 토큰 탈취 위험 → JWT가 유출되면 누구나 사용 가능
  • 토큰 크기 증가 → 페이로드가 커질수록 성능 저하 가능
  • 만료된 토큰 강제 무효화 어려움 → 즉시 로그아웃 불가능

📌 JWT 보안 강화 방법

  • HTTPS 사용하여 토큰 암호화 전송
  • 토큰을 HTTP Only & Secure 쿠키로 저장
  • 짧은 만료 시간 설정 & 리프레시 토큰 사용

5. JWT vs 세션 기반 인증

 JWT는 세션 기반 인증과 비교했을 때 장단점이 있다.

비교 항목
JWT 인증 세션 기반 인증
서버 상태 무상태(Stateless) 상태 유지(Stateful)
확장성 우수 낮음 (서버 간 세션 공유 필요)
저장 위치 클라이언트 (로컬) 서버 (세션 저장소)
보안성 탈취 시 위험 서버에서 관리 가능
사용 예시 마이크로서비스, REST API 전통적인 웹 애플리케이션
 1) JWT가 적합한 경우
  • RESTful API 인증
  • 마이크로서비스 아키텍처 (MSA)
  • 모바일 & SPA (Single Page Application)

2)세션 기반 인증이 적합한 경우

  • 일반적인 웹사이트 (세션 저장이 용이할 때)
  • 로그인된 사용자 정보를 서버에서 관리할 필요가 있을 때

6. JWT 인증 구현 (Node.js + Express)

📌 JWT 발급 예제

const jwt = require('jsonwebtoken');

const secretKey = "mySecretKey";
const payload = { userId: 1, role: "admin" };

const token = jwt.sign(payload, secretKey, { expiresIn: "1h" });
console.log("JWT:", token);

 

📌 JWT 검증 예제

try {
  const decoded = jwt.verify(token, secretKey);
  console.log("Decoded:", decoded);
} catch (error) {
  console.log("Invalid Token");
}