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

HTTP 요청 스머글링 입문 — CL.TE·TE.CL로 캐시가 오염되는 원리 [2026]

프론트·백엔드 서버가 요청 경계를 다르게 해석하면 HTTP 요청 스머글링이 발생해 캐시 오염·인증 우회로 번진다. CL.TE·TE.CL 원리와 헤더 정규화 방어를 정리했다.

HTTP 요청 스머글링은 프론트엔드(프록시·CDN)와 백엔드 서버가 한 요청의 경계를 다르게 해석해, 공격자가 뒤 요청에 몰래 요청을 끼워 넣는 취약점이다.
요청 경계가 어긋나면 다음 사용자의 요청에 악성 요청이 붙어 캐시 오염·인증 우회·자격증명 탈취로 확대되며, 프록시 계층이 많은 현대 SaaS일수록 표면이 넓다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.

한눈에 보는 핵심

Q. CL.TE와 TE.CL이 무슨 뜻인가요? A. 프론트는 Content-Length(CL)를, 백엔드는 Transfer-Encoding(TE)을 신뢰하면 CL.TE, 반대면 TE.CL입니다. 두 서버의 해석 차이가 요청 경계를 어긋나게 만듭니다. Q. 어떤 피해로 이어지나요? A. 끼워 넣은 요청이 다른 사용자의 응답에 섞이면 세션 탈취, 캐시에 악성 응답을 심으면 캐시 포이즈닝, 인증 검사를 우회하는 요청 밀반입까지 가능합니다. Q. HTTP/2를 쓰면 안전한가요? A. 종단 간 HTTP/2는 길이를 명확히 규정해 위험이 줄지만, HTTP/2를 1.1로 다운그레이드하는 구간이 있으면 다시 노출됩니다. 전 구간 일관성이 중요합니다.

자주 발생하는 실수 패턴

#패턴위험도
1Content-Length와 Transfer-Encoding 동시 포함 요청 허용치명
2프론트·백엔드 서버의 파싱 규칙 불일치 방치치명
3HTTP/2→1.1 다운그레이드 구간에서 재검증 없음높음
4모호한 헤더(공백/중복 TE)를 정규화 없이 전달높음
5프록시 로그에서 스머글링 이상징후 미탐지중간

표준 구현 코드

# WSGI/미들웨어 방어 — 모호한 길이 헤더 요청 거부
class RejectSmugglingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        te = request.META.get("HTTP_TRANSFER_ENCODING", "")
        cl = request.META.get("CONTENT_LENGTH", "")
        # CL과 TE 동시 존재는 모호 → 거부
        if te and cl:
            from django.http import HttpResponse
            return HttpResponse("ambiguous length", status=400)
        # chunked 외의 알 수 없는 TE 값 거부
        if te and te.strip().lower() != "chunked":
            from django.http import HttpResponse
            return HttpResponse("bad transfer-encoding", status=400)
        return self.get_response(request)
# 인프라단: 프론트·백엔드 HTTP 파서 버전·규칙 일치, 전 구간 HTTP/2 권장

핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·CI 게이트로 모든 경로에 일괄 적용하는 것이 표준이다.

지금 1분만 — CodeScan 무료 스캔으로 내 서비스의 노출 패턴을 자동 점검하세요.

30초 자가진단

# 1. CL+TE 동시 포함 요청에 서버가 400을 주는지(정상은 거부)
printf 'POST / HTTP/1.1\r\nHost: x\r\nContent-Length: 6\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n' | nc yourhost 80

# 2. 프론트/백엔드 서버·프록시 버전 일치 여부 점검
#    서로 다른 파서 규칙이면 위험. 전용 도구(HTTP Request Smuggler)로 안전 테스트

위 시그널이 발견되면 결함이다. OWASP HTTP Request Smuggling를 함께 참조하라.

24시간 패치 절차

순위조치
1Content-Length + Transfer-Encoding 동시 요청 400 거부
2chunked 외 알 수 없는 TE 값 거부·정규화
3프론트·백엔드 HTTP 파서 규칙·버전 일치
4가능하면 전 구간 HTTP/2, 다운그레이드 구간 재검증
5프록시 로그에 이상 요청 경계 알림 설정

지금 해야 할 것

실무자: CodeScan 무료 스캔으로 30초 점검 후 우선순위대로 패치.
CISO·임원: 조직 전체 점검·규제 대응은 SENTRIX 30분 1:1 상담으로.
결함은 발견 즉시, 늦어도 24시간 안에 패치하는 것이 표준이다.

관련 글

{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"CL.TE와 TE.CL이 무슨 뜻인가요?","acceptedAnswer":{"@type":"Answer","text":"프론트는 Content-Length(CL)를, 백엔드는 Transfer-Encoding(TE)을 신뢰하면 CL.TE, 반대면 TE.CL입니다. 두 서버의 해석 차이가 요청 경계를 어긋나게 만듭니다."}},{"@type":"Question","name":"어떤 피해로 이어지나요?","acceptedAnswer":{"@type":"Answer","text":"끼워 넣은 요청이 다른 사용자의 응답에 섞이면 세션 탈취, 캐시에 악성 응답을 심으면 캐시 포이즈닝, 인증 검사를 우회하는 요청 밀반입까지 가능합니다."}},{"@type":"Question","name":"HTTP/2를 쓰면 안전한가요?","acceptedAnswer":{"@type":"Answer","text":"종단 간 HTTP/2는 길이를 명확히 규정해 위험이 줄지만, HTTP/2를 1.1로 다운그레이드하는 구간이 있으면 다시 노출됩니다. 전 구간 일관성이 중요합니다."}}]}
HTTP Request Smuggling CL.TE TE.CL 캐시 포이즈닝 프록시

내 사이트도 점검해보세요

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

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

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

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