JWT 'none' 알고리즘 사용

Use of 'none' Algorithm in JWT

설명

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과 공유 비밀 키를 지정하여 서명을 검증합니다. 올바른 키로 검증에 성공한 토큰만 사용하고, 서비스에 필요한 클레임과 접근 권한은 별도로 확인하세요.

참조