2024. 7. 7. 17:30ㆍ실무/ISSUE
유저가 이미지가 포함되어 있는 컨텐츠 접근 시 접근이 불가하다는 문의를 받았고 로그를 확인했다.
이슈가 발생한 시점의 로그를 확인했을 때, 위 sequence diagram에서 5번 요청에 대해, `Error parsing HTTP request header` 로그가 기록되어 있는 것을 확인했다.
직감적으로 http request의 header 사이즈의 이슈인 것 같았고, 'file server'의 담당자로부터 '4. callback' 요청에 대한 header 정보를 문의했다.
전체 header는 확인할 수 없었으나 일부인 cookie 값을 전달 받았고 해당 cookie 값의 사이즈만해도 5.6KB 차지하고 있었다. cookie 값 이외에 header 값을 모두 포함한다면 max header 사이즈에 대한 에러가 발생하기에 충분한 header 사이즈인 것 같았다.
그렇다면, '내가 운영하는 서버의 max header size는 어떻게 될까'라는 궁금증이 생겼고 앞 단에 nginx, 뒷 단에 springboot 구조를 가지는 우리 서버의 max header size가 각기 다르게 설정되어 있을 것 같다는 생각이 들었다.
nginx - max header size
먼저 nginx에서 설정되어 있는 header size를 조사해보았다.
conf 파일에 따로 설정되어 있는 부분은 없었기에, default max header 사이즈에 대해 조사해야만 했다.
우선, nginx에서 header size에 대해 설정할 수 있는 필드와 설명은 다음과 같다. (해당 필드에 대한 공식 설명은 필드에 링크가 되어 있음)
요청 header의 읽기 위한 buffer size를 설정하는 필드로 default 값으로는 1k
사이즈가 큰 요청을 읽기 위한 최대 buffer의 개수와 size를 설정하는 필드로 default 값으로는 buffer 개수는 4, 한 개의 buffer size는 8k
현재 우리 서버에서 설정된 nginx에서의 한 개의 요청 당 default max header size는 8k(한 개의 buffer size)으로 볼 수 있겠다.
spring boot - max header size
그렇다면, spring boot의 header size는 어떻게 될까?
springboot에서는 max header size를 application.properties 또는 application.yaml의 'server.max-http-header-size'로 설정할 수 있다.
우리 서버는 이번에도 특별히 설정한 것은 없기 때문에 default 값으로 설정되어 있을 것이다.
apache tomcat 코드 중, default max header size를 설정하는 코드를 찾아보았고, 아래와 같이 8k로 설정되어 있음을 확인했다. (링크 참조)
/**
* Maximum size of the HTTP message header.
*/
private int maxHttpHeaderSize = 8 * 1024;
public int getMaxHttpHeaderSize() {
return maxHttpHeaderSize;
}
public void setMaxHttpHeaderSize(int valueI) {
maxHttpHeaderSize = valueI;
}
이슈 대응 및 정리
이슈가 발생한 요청의 쿠키 값을 확인했을 때, 개발망에서 발행된 쿠키값이 혼재되어 있어 비정상적으로 header size가 커진 것임을 확인했고 해당 계정을 재로그인하는 방안으로 가이드를 하여, 우리 서비스측에서는 특별히 대응하지 않고 넘어갔다.
이번 이슈를 통해, 우리 서버에 설정된 max header size에 대해 조사를 해볼 수 있었고 각 서버의 default 설정에 대해 알아 볼 수 있는 기회가 되었다.
다음 버전에는 각 서버의 max header size 값을 통일하는 작업을 진행해야지
'실무 > ISSUE' 카테고리의 다른 글
DataAccessResourceFailureException (1) | 2024.07.13 |
---|