제공 서비스
웹 보안 점검 소스코드 분석 (SAST) 외부 공격표면 진단 (EASM)
요금제 스토어 블로그 파트너 마이페이지 무료 보안 점검
웹 보안 2026.05.17 · 조회 168

Open Redirect — AI 코딩 SaaS가 피싱 사기에 이용되는 함정 [2026]

정상 도메인의 Open Redirect는 피싱 메일이 정상 SaaS URL을 거쳐 가짜 사이트로 향하게 만든다. 로그인·결제·OAuth 콜백·next 파라미터에서 가장 자주 발견된다. 화이트리스트 표준 코드와 4가지 우회 패턴을 정리했다.

Open Redirect는 SaaS가 사용자 입력 URL을 검증 없이 redirect Location 헤더에 그대로 사용하는 결함이다.
공격자는 정상 도메인(예: yoursaas.com)의 redirect URL을 자기 피싱 사이트로 가리키게 만들고, 그 링크를 메일에 넣어 보낸다. 사용자는 정상 도메인이라 신뢰하고 클릭한 후 가짜 로그인 페이지에 도달한다.
이 글은 4가지 우회 패턴, Django 표준 화이트리스트 코드, 30초 자가진단을 정리했다.

한눈에 보는 Open Redirect

Q. Open Redirect는 왜 위험한가요? A. 피싱 메일이 정상 도메인 URL을 거쳐 가짜 사이트로 도착합니다. 도메인 검증 + SPF/DMARC 통과 상태로 메일 필터를 우회하며, 사용자 신뢰가 깨집니다. Q. ?next= 같은 파라미터를 안 쓰면 되나요? A. OAuth 콜백, SSO redirect, 결제 완료 페이지 등에 사실상 필요합니다. 제거가 아닌 화이트리스트 검증이 표준입니다. Q. URL 검증을 어떻게 하나요? A. urlparse로 netloc을 추출하고 자기 도메인 화이트리스트와 비교합니다. 상대 경로(/dashboard)만 허용하는 게 가장 안전합니다. Q. //evil.com 같은 우회는 막을 수 있나요? A. //로 시작하는 프로토콜 상대 URL은 자기 도메인으로 보이지만 다른 호스트로 향합니다. urlparse 검증이 필수입니다.

4가지 자주 우회되는 패턴

#패턴예시
1startswith('/') 단순 검증//evil.com이 통과 (프로토콜 상대 URL)
2도메인 부분 일치 검색yoursaas.com.evil.com이 통과
3URL 디코딩 누락%2F%2Fevil.com이 디코드 후 //evil.com
4OAuth state 미검증redirect_uri 변경 + state 재사용으로 토큰 탈취

Django 표준 화이트리스트 구현

from urllib.parse import urlparse
from django.http import HttpResponseRedirect
from django.conf import settings

ALLOWED_HOSTS_REDIRECT = {'yoursaas.com', 'www.yoursaas.com'}

def safe_redirect(request, default='/'):
    next_url = request.GET.get('next', '') or request.POST.get('next', '')
    if not next_url:
        return HttpResponseRedirect(default)

    parsed = urlparse(next_url)

    # 1. 상대 경로만 허용 (가장 안전)
    if not parsed.netloc and not parsed.scheme:
        # //evil.com 같은 프로토콜 상대 URL 차단
        if next_url.startswith('//'):
            return HttpResponseRedirect(default)
        return HttpResponseRedirect(next_url)

    # 2. 절대 URL은 화이트리스트 호스트만
    if parsed.netloc in ALLOWED_HOSTS_REDIRECT and parsed.scheme in {'http', 'https'}:
        return HttpResponseRedirect(next_url)

    return HttpResponseRedirect(default)

핵심 4요소: (1) urlparse 사용 (2) // 프로토콜 상대 차단 (3) 화이트리스트 완전 일치 (4) scheme http(s) 한정.
javascript: 스킴은 XSS 진입점이 되므로 반드시 차단해야 한다.
Django 기본 django.utils.http.url_has_allowed_host_and_scheme 사용이 가장 깔끔하다.

지금 1분만 — CodeScan 무료 스캔으로 자기 도메인의 ?next= ?return_to= 파라미터 노출 패턴을 자동 점검합니다.

30초 자가진단

# 1. ?next= 우회 시도 — //evil.com
curl -sI "https://yourdomain.com/login?next=//evil.com" | grep -i location

# 2. URL 인코딩 우회 — %2F%2Fevil.com
curl -sI "https://yourdomain.com/login?next=%2F%2Fevil.com" | grep -i location

# 3. javascript: 스킴
curl -sI "https://yourdomain.com/login?next=javascript:alert(1)" | grep -i location

Location 헤더에 evil.com 또는 javascript:가 들어가면 Open Redirect 결함이다. CWE-601: URL Redirection to Untrusted Site 참조.

24시간 패치 절차

순위조치
1모든 redirect 함수에 url_has_allowed_host_and_scheme 적용
2OAuth redirect_uri 사전 등록 + state 파라미터 검증
3로그인·결제 완료·SSO 콜백 next 파라미터 화이트리스트화
4access log에 redirect Location 모니터링 알람

지금 해야 할 것

실무자: CodeScan 무료 스캔으로 30초 점검.
CISO·임원: 피싱 시뮬레이션 포함 점검은 SENTRIX 30분 1:1 상담.
정상 도메인 신뢰가 깨지면 브랜드 피해는 회복이 어렵다.

관련 글

{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[ {"@type":"Question","name":"Open Redirect는 왜 위험한가요?","acceptedAnswer":{"@type":"Answer","text":"피싱 메일이 정상 도메인 URL을 거쳐 가짜 사이트로 도착합니다. 도메인 검증과 SPF/DMARC 통과 상태로 메일 필터를 우회하며, 사용자 신뢰가 깨집니다."}}, {"@type":"Question","name":"?next= 같은 파라미터를 안 쓰면 되나요?","acceptedAnswer":{"@type":"Answer","text":"OAuth 콜백, SSO redirect, 결제 완료 페이지 등에 사실상 필요합니다. 제거가 아닌 화이트리스트 검증이 표준입니다."}}, {"@type":"Question","name":"//evil.com 같은 우회는 막을 수 있나요?","acceptedAnswer":{"@type":"Answer","text":"//로 시작하는 프로토콜 상대 URL은 자기 도메인으로 보이지만 다른 호스트로 향합니다. urlparse 검증이 필수입니다."}} ]}
Open Redirect 피싱 방어 리다이렉트 검증 OAuth 콜백 OWASP URL 화이트리스트

내 사이트도 점검해보세요

CodeScan으로 보안 취약점을 무료로 점검할 수 있습니다.

무료 스캔 시작하기 →
🛒
추천 상품
웹서비스 런칭 전 보안 세팅
런칭 전에 반드시 해야 하는 보안 설정을 원격으로 직접 해드립니다. HTTPS, 환경변수 분리, 보안 헤더…
220,000원 150,000원

🔒 바이브코딩 보안 체크리스트 받기

바이브코딩 보안 체크리스트(PDF)를 무료로 받아보세요.