설명
none은 서명 없는 JWT를 나타냅니다. 외부에서 받은 이런 토큰을 인증·인가의 근거로 신뢰하면 공격자가 내용을 위조해 인증을 우회하거나 다른 사용자를 사칭할 수 있습니다.
잠재적 영향
- 인증 우회 (인증 우회): 공격자가 토큰을 손쉽게 위조하여 인증을 통과할 수 있습니다.
- 민감정보 노출 (Sensitive Data Exposure): 보호되어야 할 사용자 데이터와 세션 정보가 노출될 수 있습니다.
해결 방법
- 인증·인가용 토큰은 서버에서 정한 허용 알고리즘(예:
HS256,RS256)과 신뢰할 수 있는 키로 검증하세요. - 서명 없는
none토큰을 인증 근거로 허용하지 마세요. - 발급자, 대상, 만료 조건과 사용자별 접근 권한도 확인하세요.
예시
기존 jose 1.28.2 API를 설명하는 발췌입니다. 새 구현에서는 유지보수되는 버전의 API를 사용하세요. token-here는 실제 토큰의 자리표시자입니다. 변경 후의 JWT_SECRET은 신뢰할 수 있는 경로로 공급한 최소 256비트의 무작위 공유 비밀 키를 Base64로 인코딩한 값이며, 누락·잘못된 설정과 검증 오류 처리는 생략했습니다. HS256에는 공개키가 아닌 공유 비밀 키를 사용합니다.
변경 전
javascript
const jose = require("jose");
const { JWK, JWT } = jose;
// 취약: 'none' 알고리즘을 사용함
const token = JWT.verify('token-here', JWK.None);
변경 후
javascript
const jose = require("jose");
const { JWK, JWT } = jose;
const secretKey = JWK.asKey(Buffer.from(process.env.JWT_SECRET, 'base64'));
// 허용한 HS256 알고리즘과 공유 비밀 키로 검증
const token = JWT.verify('token-here', secretKey, { algorithms: ['HS256'] });
설명:
- 변경 전: 이 코드는 'none' 알고리즘을 사용하여 JWT 서명 검증을 완전히 생략합니다. 공격자는 자신의 정보로 토큰을 만들고 서버에서 정상 사용자로 오인할 수 있습니다.
- 변경 후:
HS256과 공유 비밀 키를 지정하여 서명을 검증합니다. 올바른 키로 검증에 성공한 토큰만 사용하고, 서비스에 필요한 클레임과 접근 권한은 별도로 확인하세요.