1. 신뢰되지 않는 URL 자동접속의 위험성
CWE-601은 애플리케이션이 사용자로부터 입력받은 값을 검증 없이 리다이렉트(Redirect) 대상 주소로 사용할 때 발생합니다. 공격자는 신뢰할 수 있는 도메인의 주소 뒤에 악의적인 주소를 파라미터로 붙여(예: https://trust.com/login?redirect=https://evil.com) 사용자에게 보냅니다. 사용자는 앞부분의 신뢰할 수 있는 도메인만 보고 링크를 클릭하게 되며, 결국 공격자가 만든 정교한 가짜 로그인 페이지로 유도되어 개인정보나 세션 정보를 탈취당하게 됩니다.
2. 흔히 발생하는 취약한 패턴
가장 대표적인 사례는 로그인 후 이전 페이지로 돌아가기 위해 target, returnUrl, next와 같은 파라미터를 사용하는 경우입니다. 개발자가 단순히 response.sendRedirect(url)이나 window.location.href = url과 같이 입력값을 그대로 리다이렉트 로직에 태울 때 보안 구멍이 생깁니다. 이는 사용자의 신뢰를 이용하여 공격자의 목적지로 배달하는 일종의 '주소 조작' 사고입니다.
3. 실무적 대응: 화이트리스트 검증과 내부 경로 한정
오픈 리다이렉트를 막는 가장 확실한 방법은 리다이렉트 대상을 서버가 통제하는 것입니다.
• 화이트리스트(Allowlist) 활용: 허용된 도메인이나 URL 리스트를 미리 정의하고, 입력값이 이 리스트에 포함되는지 확인합니다.
• 상대 경로(Relative Path) 강제: 리다이렉트 대상을 현재 도메인 내부의 경로(예: /main)로만 한정합니다. 입력값에 http://나 https://와 같은 프로토콜이 포함되어 있다면 즉시 차단합니다.
• 직접 참조 방지: 외부에서 주소를 직접 전달받는 대신, 미리 정의된 페이지 ID(예: redirectId=101)를 전달받아 서버 내부에서 매핑된 주소로 보냅니다.
4. CWE-601 대응 및 안전한 리다이렉트 자바 코드 예시
코멘트: 오픈 리다이렉트 방어의 핵심은 "우리 서비스가 타 사이트로 가는 셔틀버스 역할을 하게 두지 않는 것"입니다. 사용자의 입력을 리다이렉트 주소로 써야 한다면 반드시 상대 경로인지 확인하거나 화이트리스트 기반의 철저한 검증을 거치십시오. logger.debug()를 통해 의심스러운 유도 시도를 기록하되, 우리 시스템의 신뢰를 담보로 사용자를 사지로 몰아넣는 통로를 완벽히 차단하는 것이 시큐어 코딩의 도덕적이자 기술적인 책임입니다.
댓글 달기