반응형
📌 목차
- JWT(JSON Web Token)란?
- JWT 공격의 원리
- 주요 JWT 공격 기법
- 보안 위협과 실제 사례
- 방어 방법 및 대응 방안
🔍 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(대칭키)로 변경하면 공격자가 자신의 공개 키를 사용하여 서명 가능
✅ 공격 예제
- 서버가 RS256(비공개 키로 서명, 공개 키로 검증) 방식으로 동작
- 공격자가 HS256으로 변경 후, 공개 키를 서명 키로 사용하여 위조된 토큰 생성
- 서버가 이를 검증하면 공격자의 토큰이 유효한 것으로 처리됨
🚨 결과:
- 공격자가 서버의 공개 키만 알아도 임의의 JWT 생성 가능
- 관리자 권한 탈취 가능
⚠️ 보안 위협과 실제 사례
✅ 보안 위협
- 🛡️ 인증 우회: 공격자가 서명을 제거하거나 변조하여 무단 접근 가능
- 🎭 권한 상승(Privilege Escalation): 사용자 계정을 관리자 계정으로 변조 가능
- 🚀 세션 하이재킹(Session Hijacking): 유효한 JWT를 가로채어 재사용 가능
- 💣 대량 공격 가능(Brute Force Attack): JWT 서명 키가 약할 경우 무차별 대입 공격 가능
✅ 실제 발생 사례
- 2015년 JWT None 알고리즘 취약점 발견
- alg: none을 허용하는 서버에서 서명을 제거한 JWT가 유효한 것으로 처리되는 문제 발견
- 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
반응형
'보안' 카테고리의 다른 글
🛑 Subdomain Takeover: 삭제된 서브도메인을 점유하여 피싱 공격 🚨 (0) | 2025.02.21 |
---|---|
🌐 DNS Rebinding: 도메인을 내부 네트워크 IP로 변조하여 내부 시스템 침투 🚨 (0) | 2025.02.20 |
🚨 WebSockets 공격: 인증되지 않은 연결을 악용한 보안 취약점 🔓 (0) | 2025.02.20 |
🚨 Mass Assignment 공격: 숨겨진 필드를 조작하여 관리자 권한 탈취 🔓 (0) | 2025.02.20 |
🔓 BOLA 공격(Broken Object Level Authorization): 인증 취약점을 악용한 데이터 탈취 🚨 (0) | 2025.02.20 |