SYN 쿠키(SYN cookie)는 TCP SYN 플러드(SYN Flood) 공격에 대응하기 위해 사용되는 네트워크 보안 기술이다. 이 기술은 1996년 9월 대니얼 J. 번스타인(Daniel J. Bernstein)과 에릭 쉔크(Eric Schenk)에 의해 개발되었으며, 첫 번째 구현체는 같은 해 10월 제프 와이스버그(Jeff Weisberg)가 SunOS용으로 출시하였고, 1997년 2월에는 에릭 쉔크가 리눅스용 구현체를 출시했다. FreeBSD는 2002년 1월 출시된 FreeBSD 4.5부터 이를 지원한다.
SYN 쿠키의 핵심 원리는 TCP 3-way 핸드셰이크 과정 중 서버가 SYN 패킷을 수신했을 때, 연결 정보를 서버의 SYN 백로그 큐(backlog queue)에 저장하지 않고 SYN+ACK 응답 패킷의 초기 시퀀스 번호(ISN)에 암호화하여 인코딩하는 것이다. 이렇게 함으로써 SYN 큐에 저장 공간을 소모하지 않으므로, 공격자가 대량의 SYN 패킷을 보내 큐를 가득 채워 정상적인 연결 요청을 차단하는 SYN 플러드 공격을 효과적으로 방어할 수 있다.
SYN 쿠키의 시퀀스 번호는 다음과 같은 방식으로 구성된다:
- 상위 5비트: 느리게 증가하는 타임스탬프(t) 값의 모듈로(mod 32)
- 중간 3비트: 최대 세그먼트 크기(MSS) 값을 인코딩한 값
- 하위 24비트: 서버 IP/포트, 클라이언트 IP/포트, 타임스탬프 값을 기반으로 한 암호학적 해시 함수의 결과값(s)
클라이언트가 SYN+ACK에 응답하여 ACK 패킷을 보낼 때, TCP 규격에 따라 서버가 보낸 시퀀스 번호에 1을 더한 값을 확인 응답 번호(Acknowledgement number)로 사용한다. 서버는 이 값에서 1을 빼서 원래의 SYN 쿠키를 복원하고, 타임스탬프 만료 여부 확인, 해시값 재검증, MSS 값 추출 등을 수행한 후 정상적으로 연결을 진행한다.
SYN 쿠키 사용 시 몇 가지 제약 사항이 있다. MSS 값 인코딩에 3비트만 사용할 수 있으므로 서버는 최대 8개의 서로 다른 MSS 값만 지원할 수 있다. 또한 일부 TCP 확장 기능(예: 대규모 윈도우 스케일링)과의 호환성 문제가 발생할 수 있다. 보안 측면에서는 SYN 쿠키가 활성화된 포트에서만 동작하도록 설계되어야 하며, 전역 변수로 설정할 경우 방화벽 우회 공격에 취약해질 수 있다(리눅스 커널에서 CVE-2001-0851로 보고된 사례).
현대 운영체제의 TCP/IP 스택에서는 일반적으로 SYN 백로그 큐가 가득 찰 경우에만 SYN 쿠키를 활성화하도록 설정되어 있으며, 리눅스의 경우 net.ipv4.tcp_syncookies sysctl 파라미터로 동작을 제어할 수 있다.