본문 바로가기
보안

🚨 JWT 공격(JSON Web Token Exploitation): 취약한 서명 알고리즘을 악용한 토큰 변조 🔓

by IT 분석가 2025. 2. 20.
반응형

JWT 공격

 

📌 목차

  1. JWT(JSON Web Token)란?
  2. JWT 공격의 원리
  3. 주요 JWT 공격 기법
  4. 보안 위협과 실제 사례
  5. 방어 방법 및 대응 방안

🔍 JWT(JSON Web Token)란?

JWT(JSON Web Token)사용자의 인증 및 권한 정보를 포함하는 보안 토큰으로,
웹 애플리케이션에서 무상태(stateless) 방식으로 인증을 유지하는 데 사용된다.

 

JWT의 기본 구조

Header.Payload.Signature
 

예제:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4ifQ.sgnPz6EXAM4Jx5E7FsHgA
  • Header: 서명 알고리즘 정보 포함 (HS256, RS256 등)
  • Payload: 사용자 ID, 권한 정보 등
  • Signature: 토큰 변조 방지를 위한 서명

하지만, 잘못된 구현으로 인해 공격자가 JWT를 변조하여 권한을 상승시키거나 인증을 우회할 수 있는 취약점이 발생할 수 있음.


⚙️ JWT 공격의 원리

JWT는 기본적으로 서명을 통해 변조를 방지하지만,
취약한 서명 알고리즘을 사용하거나, 서버의 검증이 올바르게 이루어지지 않는 경우 공격이 가능함.

 

취약한 JWT 예제 (None 알고리즘 사용)

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

📌 JWT는 기본적으로 None 알고리즘을 허용하면 서명을 검증하지 않음
📌 공격자가 서명을 제거하고 원하는 정보를 삽입 가능

 

공격자가 변조한 JWT

eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4ifQ.
 

🚨 결과:

  • 서버가 alg: none을 허용하면 서명 없이 JWT가 유효한 것으로 인정됨
  • 공격자가 관리자 권한을 획득 가능

🚨 주요 JWT 공격 기법

1️⃣ None 알고리즘 공격 (Algorithm Confusion Attack)

📌 공격 방식

  • 서버가 alg: none을 허용하면 서명을 제거하여 토큰을 변조 가능

공격 예제

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

🚨 결과:

  • 서명 없이도 인증된 사용자로 인식됨
  • 공격자가 임의의 사용자 권한을 얻을 수 있음

2️⃣ 대칭키 알고리즘 키 유출 (HS256 to RS256 변경 공격)

📌 공격 방식

  • HS256 알고리즘을 사용하는 경우, 서버의 비밀 키가 유출되면 임의의 토큰 생성 가능

공격 예제

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

🚨 결과:

  • 공격자가 HS256 비밀 키를 알아내면 임의의 토큰을 서명하여 서버에서 인정받을 수 있음

3️⃣ JWT 서명 우회 공격 (RS256 -> HS256 변경)

📌 공격 방식

  • JWT에서 RS256(비대칭키)에서 HS256(대칭키)로 변경하면 공격자가 자신의 공개 키를 사용하여 서명 가능

공격 예제

  1. 서버가 RS256(비공개 키로 서명, 공개 키로 검증) 방식으로 동작
  2. 공격자가 HS256으로 변경 후, 공개 키를 서명 키로 사용하여 위조된 토큰 생성
  3. 서버가 이를 검증하면 공격자의 토큰이 유효한 것으로 처리됨

🚨 결과:

  • 공격자가 서버의 공개 키만 알아도 임의의 JWT 생성 가능
  • 관리자 권한 탈취 가능

⚠️ 보안 위협과 실제 사례

보안 위협

  • 🛡️ 인증 우회: 공격자가 서명을 제거하거나 변조하여 무단 접근 가능
  • 🎭 권한 상승(Privilege Escalation): 사용자 계정을 관리자 계정으로 변조 가능
  • 🚀 세션 하이재킹(Session Hijacking): 유효한 JWT를 가로채어 재사용 가능
  • 💣 대량 공격 가능(Brute Force Attack): JWT 서명 키가 약할 경우 무차별 대입 공격 가능

 

실제 발생 사례

  1. 2015년 JWT None 알고리즘 취약점 발견
    • alg: none을 허용하는 서버에서 서명을 제거한 JWT가 유효한 것으로 처리되는 문제 발견
  2. 2021년 GitHub에서 JWT 키 유출 사례
    • 잘못된 설정으로 인해 JWT 서명 키가 노출되어 인증 우회 가능성 발생

🔐 방어 방법 및 대응 방안

1. None 알고리즘 사용 금지

  • alg: none을 허용하지 않도록 서버 설정 변경
  • 예제 (Node.js + jsonwebtoken)
jwt.verify(token, secret, { algorithms: ["HS256", "RS256"] });

 

2. 강력한 서명 키 사용 및 보호

  • 최소 32바이트 이상의 비밀 키 사용
  • 환경 변수에 저장하여 코드에 직접 포함하지 않도록 설정

3. 알고리즘 변경 공격 방지 (RS256 -> HS256 차단)

  • JWT가 RS256을 사용할 경우, 공개 키가 서명에 사용되지 않도록 설정
  • 예제 (Express)
if (decoded.header.alg !== "RS256") {
    throw new Error("Invalid Algorithm");
}

 

4. JWT의 유효 기간 설정

  • 무제한 토큰을 방지하고, 토큰의 만료 시간(exp)을 짧게 설정
  • 예제 (Node.js)
jwt.sign(payload, secret, { expiresIn: "15m" });

 

5. 토큰 재사용 방지(Blacklist 사용)

  • 로그아웃 시 JWT를 블랙리스트에 추가하여 탈취된 토큰이 재사용되지 않도록 설정

6. 웹 애플리케이션 방화벽(WAF) 적용

  • JWT 패턴을 감지하여 비정상적인 서명을 차단

7. 정기적인 보안 점검 수행

  • OWASP ZAP, Burp Suite 등을 사용하여 JWT 취약점 점검

📌 해시태그
#JWT #웹보안 #API보안 #토큰변조 #정보유출 #보안취약점 #인증우회 #권한상승 #JSONWebToken

반응형