Keepalive 타임아웃을 설정해야 하는 이유
TCP keep-alive란?
- TCP keep-alives는 이미 확립된 TCP 연결이 여전히 유효한지 확인하는 데 사용됩니다.
- 네트워크 중간에서 연결이 끊어진 경우, 연결이 끊어진 것을 인지하지 못하는 상황이 발생할 수 있으며 이 를 "half-open connection" 상태라고 합니다.
- 이 기능은 특히 "half-open connection" 문제를 해결하기 위해 도입되었습니다.
- 주기적으로 미니멀한 데이터 패킷을 상대방에게 전송하여 연결이 여전히 활성 상태인지 확인합니다. 응답이 없으면 연결이 끊어졌다고 판단하고 연결을 종료합니다. 이를 통해 "half-open connection" 상태를 감지하고 방지할 수 있습니다.
Slowloris 공격이란?
- Slowloris는 HTTP 서버에 대한 DoS(서비스 거부) 공격 유형 중 하나입니다.
- 이 공격의 목적은 가능한 적은 리소스로 웹 서버를 고갈시켜 정상적인 서비스를 방해하는 것입니다.
- Slowloris는 서버에 많은 수의 HTTP 연결을 개방하고, 이 연결들을 가능한 한 오랫동안 열려 있게 유지하여 서버의 연결 슬롯을 점유합니다. 이를 통해 새로운 정상적인 연결을 방해하게 됩니다.
- 공격자는 연결을 시작하고 헤더를 굉장히 느리게 전송하여 서버가 연결을 유지하게 만들며 연결이 끝나기 전에 공격자는 일부러 연결을 끊지 않고 계속 유지하도록 하며 이로 인해 서버는 연결을 계속 대기하게 되어 리소스가 고갈됩니다.
Slowloris 공격으로 인해 연결 리소스가 고갈되거나 이로 인해 새로운 요청을 처리하지 못하게 되어 실제 사용자들은 웹 서비스에 접근하지 못하게 됩니다. 또한 웹 서버가 데이터베이스와 통신하기 위해 사용하는 연결 풀(Connection Pool)은 제한된 크기를 가지는데 Slowloris 공격으로 인해 웹 서버에서 많 은 요청이 데이터베이스로 전달되는 경우, 연결 풀이 빠르게 고갈되어 새로운 데이터베이스 연결을 처리하지 못할 수 있습니다.
따라서 최초 트래픽이 인입되는 로드밸런서의 keep-alive 타임아웃 제한시간을 적절히 설정하거나 웹 서버의 타임아웃 설정을 조절하여 짧은 시간 내에 완료되지 않는 연결을 강제로 끊음으로써 하나의 요청이 오랜 기간동안 커넥션 연결을 맺지 않도록 설정해야 합니다.