본문 바로가기
IT

JWT 토큰 안전한 인증과 권한 부여를 위한 방법

by 불멸남생 2025. 4. 2.

JWT 토큰이란 무엇인가?

JWT(Json Web Token)는 웹 애플리케이션에서 사용자 인증권한 부여를 안전하고 효율적으로 처리하기 위해 사용되는 개방형 표준(RFC 7519)이다. JWT는 사용자의 로그인 상태를 유지하거나, API 접근 권한을 제어하는 데 핵심적으로 활용되며, 세션 기반 인증 방식의 단점을 보완하는 토큰 기반 인증 방식의 대표적인 예시다.

JWT의 구성 요소

JWT는 총 세 부분으로 구성되며, 각각은 점(.)으로 구분된다.

  1. Header (헤더)
    어떤 알고리즘으로 서명되었는지, 타입이 무엇인지 명시함.
  2. { "alg": "HS256", "typ": "JWT" }
  3. Payload (페이로드)
    사용자의 인증 정보와 권한을 담는 공간. 예:
  4. { "sub": "1234567890", "name": "홍길동", "admin": true }
  5. Signature (서명)
    위 두 개의 정보를 기반으로 한 무결성 보장용 서명. 이 서명 덕분에 정보 위조를 방지할 수 있다.

JWT의 기본 구조 예시

xxxxx.yyyyy.zzzzz

JWT는 이처럼 간단한 구조로 빠르고, 다양한 플랫폼 간 인증을 지원하며, 세션 서버 없이도 상태 유지가 가능하다는 장점이 있다.

반응형

JWT 토큰의 주요 활용 사례

사용자 인증(Authentication)

JWT는 로그인 후 생성되어 사용자의 상태를 클라이언트에서 유지할 수 있게 해준다. 서버는 별도의 세션 저장소 없이도 유저를 인증할 수 있기 때문에, 무상태(stateless) 서버 구조를 구현할 수 있다.

권한 부여(Authorization)

JWT를 통해 사용자가 접근할 수 있는 리소스를 제한할 수 있다. 예를 들어, admin=true와 같은 Claim을 통해 관리자의 접근을 제어할 수 있다.
JWT는 마이크로서비스 아키텍처에서의 서비스 간 인증 및 권한 부여에도 효과적이다.

API 인증

JWT는 서버 간 API 통신에서 인증 방식으로 많이 활용된다. 특히 OAuth2의 Access Token으로 자주 사용된다.

반응형

JWT 토큰의 장점과 단점

장점

  • 무상태 서버 구현 가능: 세션 저장소 불필요.
  • 플랫폼 독립성: 웹, 모바일, 서버 등 어디서든 사용 가능.
  • 빠른 처리 속도: Base64 인코딩을 통한 빠른 전송과 파싱.
  • 확장성: 다양한 Claim을 통해 유연하게 인증 정보 구성 가능.

단점

  • 토큰 탈취 시 위험: 한번 탈취되면 유효기간까지 무제한 사용 가능.
  • 토큰 무효화 어려움: JWT는 기본적으로 서버에 저장되지 않으므로, 강제 로그아웃이나 토큰 무효화가 복잡하다.
  • 용량 문제: Payload에 많은 정보를 담을 경우 네트워크 사용량 증가.

보안 이슈

  • HTTPS 필수: 암호화되지 않은 채널로 JWT를 주고받을 경우 중간자 공격 위험.
  • 짧은 유효시간 설정 권장: 탈취 대비.
  • Refresh Token 별도 관리 필요: Access Token보다 긴 유효기간을 갖는 Refresh Token은 별도 저장 및 관리가 필요하다.
반응형

JWT 토큰의 사용 방법과 구현 절차

1. 로그인 요청 및 사용자 인증

클라이언트가 사용자 정보(ID/PW)를 서버에 전송하면, 서버는 이를 검증 후 JWT를 생성하여 클라이언트에 전달한다.

2. JWT 저장

클라이언트는 서버로부터 받은 JWT를 로컬 스토리지쿠키에 저장한다. 이때 XSS 공격에 대비하여 HttpOnly 쿠키 저장 방식이 권장된다.

3. 요청 시 JWT 전송

클라이언트는 인증이 필요한 API 요청 시 JWT를 HTTP Header의 Authorization 필드에 아래와 같이 포함하여 전송한다.

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR...

4. 서버에서 JWT 검증

서버는 전달받은 JWT를 복호화하여 서명과 만료 시간 등을 검증하고, 해당 사용자가 올바른 권한을 가졌는지 확인한다.

반응형

JWT 토큰과 OAuth2, 세션 방식 비교

구분 JWT 세션 OAuth2

상태 저장 방식 무상태 (Stateless) 상태 저장 (Stateful) 무상태
확장성 우수 낮음 우수
관리 방식 클라이언트 중심 서버 중심 토큰 중심
토큰 무효화 복잡함 쉬움 Refresh Token 필요
보안 방식 HTTPS 필수 서버 인증 기반 권한 위임 구조

JWT는 OAuth2와 함께 사용되기도 하며, REST API 백엔드 구조에서 특히 선호되는 인증 방식이다.

반응형

JWT 사용 시 유의할 점 및 보안 팁

XSS와 CSRF 방지

  • JWT는 반드시 HTTPS 환경에서 사용해야 한다.
  • Access Token은 로컬 스토리지에 저장 금지, HttpOnly 쿠키 사용 권장.
  • CSRF 대응을 위해 SameSite 속성과 CSRF 토큰 활용 필요.

토큰 유효 시간 관리

  • Access Token은 짧게 (예: 15분)
  • Refresh Token은 길게 (예: 7일)
  • 만료 시간과 재발급 로직을 구체적으로 설계해야 한다.

토큰 크기 최적화

  • 불필요한 Claim 제거
  • 사용자 식별에 필요한 최소한의 정보만 담을 것
반응형

실무에서의 JWT 토큰 사용 전략

마이크로서비스에서의 JWT

마이크로서비스 구조에서는 JWT 기반 인증이 특히 적합하다. 서비스 간 인증 과정에서 토큰을 공유할 수 있으며, 중앙 인증 서버와 각 서비스 간에 일관된 권한 검증 체계를 유지할 수 있다.

모바일 앱에서의 JWT

모바일 환경에서는 세션 방식이 불편하므로, JWT가 효율적인 대안이다. 클라이언트가 토큰을 직접 보관하며, 오프라인 캐싱에도 유리하다.

SPA(Single Page Application)에서의 JWT

SPA 구조에서는 페이지 리로드 없이도 상태 유지를 해야 하므로, JWT를 통한 클라이언트 기반 인증이 이상적이다. React, Vue 등과의 조합에서도 유용하게 활용된다.

반응형

JWT 토큰 관련 추천 라이브러리 및 도구

언어/환경 라이브러리

Node.js jsonwebtoken
Java jjwt, java-jwt
Python PyJWT, authlib
PHP firebase/php-jwt
Ruby ruby-jwt

또한 https://jwt.io에서 JWT 디코딩, 서명 검증 등 다양한 실습 도구를 사용할 수 있다.

반응형

결론

JWT는 RESTful API, 마이크로서비스, 모바일 앱, SPA 등 현대적 시스템 아키텍처에서 가볍고 확장성 있는 인증/권한 부여 방식으로 자리 잡았다. 보안과 성능을 모두 충족할 수 있으나, 적절한 토큰 저장 방식, 만료 시간 설계, 서명 검증 로직 등이 동반되지 않으면 위험이 될 수 있다.

정확한 설계와 보안 강화 전략을 기반으로 JWT를 도입한다면, 인증 인프라를 효과적으로 혁신할 수 있다.

반응형