제공 서비스
웹 보안 점검 · 무료 단건 외부 공격표면 관리 · 지속 자동 AI 취약점 진단 · 신규 모의해킹 · 침투 테스트
요금제 스토어 블로그 파트너 마이페이지 무료 보안 점검
웹 취약점 2026.06.17 · 조회 7325

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

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

S
보안 전문 기업 SENTRIX 레드팀
해킹대회 수상 · 보안 실무 10년 · 실전 진단 경험을 바탕으로 작성합니다.
이 글의 취약점, 내 사이트엔 없을까요? URL 하나로 30초 무료 점검.

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 캐시 포이즈닝 프록시

내 사이트도 점검해보세요

URL 하나면 21개 항목을 30초에 무료 점검합니다. 회원가입·카드 없이.

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

AI 코딩 보안 체크리스트 받기

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