[400 Bad Request] - Header Or Cookie Too Large 해결방법
※ 실제 사용자 입장(싸이트 담당자가 아닌)인 경우 간단하게 브라우저의 쿠키만 지워줘도 문제가 해결 된다!
- 이번 내용은 사이트 담당자 입장에서 해당 문제를 어떻게 방지할 지에 대한 내용을 다루려고 한다.
- 브라우저에서 쿠키 삭제하는방법도 혹시몰라 남겨 둔다.
ex) 크롬
- 크롬 실행 > 우측 상단 점3개 아이콘 클릭 > 설정 클릭
- 좌측 메뉴 "개인 정보 및 보안" 클릭 > "인터넷 사용 기록 삭제" 클릭
- 개별 사이트별로삭제 할 수도 있지만, 본 글의 목표가 아니므로 전체 삭제하는 방법만남겨 둔다.
1. 에러 현상 확인
- 고객 브라우저에서 간헐적으로 이미지가 잘 보이지 않는 현상이 접수 되었다.
- 해당 이미지의 url을 치고 들어가면 다음과 같은 메세지를 볼 수 있다.
2. 에러 발생 원인
- 로그 분석시 client_header_buffer_size 부족함을 확인할 수 있었다.
- 우리의 경우 이미지 CDN 웹서버가 Nginx로 되어 있었고, 다음 설정값이 Default 설정으로 되어 있었다.
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
1) client_header_buffer_size : 일반적으로 요청되는 request에 대한 버퍼 크기 지정
2) large_client_header_buffers : 위의 용량을 오버 하는 요청에 대해 처리할 버퍼 크기 지정
- 8kb 앞에 적힌 숫자 4는 8kb 버퍼를 4개 만든다는 뜻 이다. (최대 4개까지 처리할수 있다)
ex) 우리의 경우 위 설정 중 "large_client_header_buffers" 사이즈를 오버하는 요청의 경우 에러가 발생 하였다.
- 위 이미지의 Request Header내 Cookie가 무지막지하게 긴 것을 확인 할 수 있었다.
3. 해결 방법
- 위에 서의 2가지 설정을 변경하여 수정 가능 하다.
1) client_header_buffer_size : 일반적으로 요청되는 request에 대한 버퍼 크기 지정
2) large_client_header_buffers : 위의 용량을 오버 하는 요청에 대해 처리할 버퍼 크기 지정
Case1) client_header_buffer_size 를 늘린다.
ex) client_header_buffer_size 1k; >>>> 32k
- 대부분의 요청은 32k를 넘지 않을텐데 너무 과하게 버퍼를 늘린상황이 될 수 있다. ( 서버 자원 낭비 )
- 즉 비효율적이니 권장하지 않는다.
Case2) large_client_header_buffers 를 늘린다.
ex) large_client_header_buffers 4 8k; >>>> 32k
- 일반적인 요청의 헤더는 1kb 버퍼로 처리, 그것보다 큰 요청은 32k 버퍼로 처리하는 것 이므로 위의 경우보다 효율적이다.
※ 참고 Nginx 몇가지 설정
- client_body_buffer_size : 클라이언트 버퍼사이즈로 주로 FORM에서 POST액션으로 NGINX에 보내는 크기
- client_header_buffer_size : 클라이언트 헤더 버퍼사이즈 (보통 1K로 설정)
- client_max_body_size : 클라이언트 요청(request)에 허용된 최대 크기. 만약 최대크기를 초과하면 nginx는 413 에러를 만듬
- large_client_header_buffers: 클라이언트 헤더 최대 개수 및 크기
- http2_max_field_size: 압축된 요청 헤더 필드의 최대 크기 제한
- http2_max_field_size: 압축 해제 후 전체 요청 헤더 목록의 최대 크기 제한