HTTP 요청에 대한 HTTP 400 잘못된 요청(너무 긴 요청 헤더) 응답

Kerberos 인증이 필요한 HTTP 요청이 IIS(인터넷 정보 서비스)에서 호스트되는 웹 사이트로 전송되고 Kerberos 인증을 사용하도록 구성된 경우 HTTP 요청 헤더는 매우 길어집니다. 이 문서는 HTTP 요청 헤더가 너무 길 때 발생하는 HTTP 400 오류를 해결하는 데 도움이 됩니다.

원래 제품 버전: Windows Server 2016
원본 KB 번호: 2020943

증상

Kerberos 인증이 필요한 HTTP 요청은 브라우저에서 IIS에서 호스트되는 웹 사이트로 전송됩니다. 웹 사이트는 Kerberos 인증을 사용하도록 구성됩니다. 그러나 예상되는 웹 페이지를 받는 대신 다음과 유사한 오류 메시지가 표시됩니다.

HTTP 400 - 잘못된 요청(너무 긴 요청 헤더)

이 응답은 winRM(Windows 원격 관리)을 포함하는 HTTP 요청에 의해 생성될 수 있습니다.

원인

이 문제는 사용자가 많은 Active Directory 사용자 그룹의 구성원인 경우에 발생할 수 있습니다.

서버에 대한 HTTP 요청에는 WWW-Authenticate 헤더의 Kerberos 토큰이 포함됩니다. 헤더 크기는 사용자 그룹 수와 함께 증가합니다. HTTP 헤더 또는 패킷 크기가 서버에 구성된 제한을 초과하여 증가하는 경우 서버는 요청을 거부하고 오류 메시지를 응답으로 보낼 수 있습니다.

해결 방법 1: Active Directory 그룹 수 줄이기

사용자가 구성원인 Active Directory 그룹의 수를 줄입니다.

해결 방법 2: MaxFieldLength 및 MaxRequestBytes 레지스트리 항목 설정

사용자의 요청 헤더가 이러한 값을 초과하지 않도록 서버의 MaxRequestBytes 레지스트리 항목 및 MaxFieldLength에 대한 설정을 늘입니다. 적절한 설정을 결정하려면 다음 계산을 사용합니다.

  1. 다음 문서에 설명된 수식을 사용하여 사용자의 Kerberos 토큰 크기를 계산합니다.
    사용자가 여러 그룹에 속하는 경우 Kerberos 인증 문제

  2. 서버의 MaxFieldLengthMaxRequestBytes 값을 4/3 * T 바이트로 설정합니다. 여기서 T는 사용자의 토큰 크기(바이트)입니다. HTTP는 base64 인코딩을 사용하여 Kerberos 토큰을 인코딩합니다.

    참고

    이렇게 하면 토큰의 3바이트마다 base64로 인코딩된 4바이트로 교체됩니다. 레지스트리에 대한 변경 내용은 HTTP 서비스를 다시 시작할 때까지 적용되지 않습니다. 또한 IIS 서비스와 같은 관련 서비스를 다시 시작해야 할 수도 있습니다.

애플리케이션 환경에 따라 Kerberos 대신 Windows NTLM(NT LAN Manager)을 사용하도록 웹 사이트를 구성하여 이 문제를 해결할 수도 있습니다. 일부 애플리케이션 환경에서는 위임에 Kerberos 인증을 사용해야 합니다. Kerberos 인증은 NTLM보다 더 안전한 것으로 간주합니다. 또한 보안 및 위임 파급 효과를 고려하기 전에 Kerberos 인증을 사용하지 않도록 설정하지 않는 것이 좋습니다.

추가 정보

기본적으로 MaxFieldLength 레지스트리 항목은 없습니다. 이 항목은 각 HTTP 요청 헤더의 최대 크기 제한을 지정합니다. MaxRequestBytes 레지스트리 항목은 요청 줄 및 헤더의 총 크기에 대한 상한을 지정합니다. 일반적으로 이 레지스트리 항목은 MaxRequestBytes 레지스트리 항목과 함께 구성됩니다. MaxRequestBytes 값이 MaxFieldLength 값보다 낮으면 MaxFieldLength 값이 조정됩니다. 대규모 Active Directory 환경에서는 이러한 두 항목의 값이 충분히 높은 값으로 설정되지 않은 경우 로그인 오류가 발생할 수 있습니다.

IIS 6.0 이상의 경우 MaxFieldLengthMaxRequestBytes 레지스트리 키는 다음 하위 키에 있습니다.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

키 값을 다음 표에 표시된 것과 같이 설정합니다.

이름 값 형식 값 데이터
MaxFieldLength DWORD (4/3 * T바이트) + 200
MaxRequestBytes DWORD (4/3 * T바이트) + 200

다음 표와 같이 레지스트리 키를 최대값으로 설정할 수도 있습니다. 레지스트리 설정을 변경하기 전에 모든 잠재적인 보안 파급 효과를 고려합니다.

이름 값 형식 값 데이터
MaxFieldLength DWORD 65536(십진법) 또는 10000(16진수)
MaxRequestBytes DWORD 16777216(십진법) 또는 1000000(16진수)

중요

이 레지스트리 키를 변경하는 것은 아주 위험한 작업으로 간주됩니다. 이러한 키를 사용하면 더 큰 HTTP 패킷을 IIS로 보낼 수 있습니다. 이로 인해 Http.sys가 더 많은 메모리를 사용할 수 있습니다. 따라서 이러한 변경으로 인해 악의적인 공격에 대한 컴퓨터의 취약성이 증가할 수 있습니다.

MaxFieldLength이(가) 최대값인 64KB로 설정된 경우 MaxTokenSize 레지스트리 값은 3/4 * 64 = 48KB로 설정해야 합니다. MaxTokenSize 설정에 대한 자세한 내용은 사용자가 여러 그룹에 속할 때 Kerberos 인증과 관련하여 발생하는 문제를 참조하세요.

참조