웹은 정확한 합의에 의해 유지됩니다. Content-Length 필드는 각 중간 단계에서 동일한 의미여야 합니다. 캐시는 검증이 필요한 응답을 재사용해서는 안 됩니다. 잘못된 형식의 HTTP/3 필드 섹션은 올바른 범위에서 실패해야 합니다. 안전한 메서드는 리버스 프록시를 통과한 후에도 안전해야 합니다.
Webship 1.3.1은 한 가지 규칙을 중심으로 만들어졌습니다: 바이트가 의미를 유지할 때만 속도가 중요합니다.
그것이 바로 우리가 Webship을 세계에서 가장 RFC 호환성이 높은 범용 웹 서버라고 설명하는 이유입니다. 이것은 모든 RFC의 선택적 기능이 존재한다는 주장이 아니라, 명확한 경계를 가진 엔지니어링적 주장입니다. 아래 지도는 Webship의 활성 서버 동작이나 자체 프로토콜 기반에 영향을 미치는 52개의 RFC를 명시하고 있습니다. 현재 표준이 먼저 나오며, 대체된 문서는 호환성 계보로 표시됩니다. 초안 사양은 RFC로 재분류되지 않습니다.
호환성은 배지가 아니라 행동입니다
Webship는 생산 서버가 가장 자주 모호해지는 장소에서 기준을 적용합니다:
- HTTP/1.1 프레이밍은 상충되는 길이, 잘못된 전송 코딩, 과도한 요청 대상, 잘못된 청크, 그리고 요청 스머글링 형태를 거부합니다.
- HTTP/2와 HTTP/3는 금지된 연결 필드를 거부하고, 의사 필드를 검증하며, 압축된 필드 섹션에 한계를 두고, 스트림 오류를 연결 오류와 분리합니다.
- 정적 파일은 HEAD 의미론, 검증자, 전제 조건 순서, 바이트 범위, 리디렉션 및 콘텐츠 유형을 유지합니다.
- 리버스 프록시는 홉 단위 필드를 제거하면서 프레이밍, 취소, 트레일러, 업그레이드, 안전한 재시도 및 전달 신원을 유지합니다.
- 캐시는 캐싱을 키-값 단축키로 취급하는 대신, 나이, 신선도, 재검증, Vary, 무효화 및 오래된 사용 규칙을 계산합니다.
- TLS, QUIC, ACME, 초기 데이터 및 WebTransport는 제한된 상태와 명시적인 실패 정책을 사용합니다.
빠른 경로에도 동일한 규칙이 적용됩니다. Webship은 하나의 '정확한' 경로와 다른 벤치마크 경로를 정의하지 않습니다.
HTTP 의미론, 프레이밍, 캐싱 및 프록시
- RFC 3986 — 통합 자원 식별자(URI): 일반 구문. Webship은 캐시 무효화 결정을 내리기 전에 점(.) 세그먼트를 포함한 상대 위치(Location) 및 콘텐츠 위치(Content-Location) 참조를 정규화합니다.
- RFC 6455 — 웹소켓 프로토콜. 리버스 프록시 업그레이드는 웹소켓 키, 수락 값, 서브프로토콜, 확장 및 터널 전환을 검증합니다.
- RFC 6585 — 추가 HTTP 상태 코드. 요청 필드가 너무 큰 경우, HTTP 응답이 여전히 가능한 경우 정의된 431 응답을 사용합니다.
- RFC 6797 — HTTP 엄격 전송 보안. Strict-Transport-Security는 보안 전송에서만 전송되며, 절대 전송 중립 캐시 항목에서 평문 HTTP로 유출되지 않습니다.
- RFC 7235 — HTTP/1.1 인증. 인증 스킴 토큰은 보호된 MCP 제어 표면을 포함하여 대소문자를 구분하지 않고 구문 분석됩니다. 일반적인 HTTP 의미론은 이제 RFC 9110에 있습니다.
- RFC 7239 — 전달된 HTTP 확장. 운영자는 표준 기반 Forwarded 필드, 이전 X-Forwarded 필드, 둘 다 또는 어느 것도 선택할 수 있습니다; 신뢰할 수 없는 수신된 신원 필드는 먼저 제거됩니다.
- RFC 7540 — HTTP/2. 이것은 HTTP/2 호환성 계보로 유지됩니다; 활성 HTTP/2 계약은 그 후속 문서인 RFC 9113입니다.
- RFC 7541 — HTTP/2를 위한 헤더 압축: HPACK. Webship에서 소유한 HTTP/2 스택은 HPACK 와이어 포맷과 허프만 코딩을 유지하면서 디코더 상태와 인코더 테이블을 제한합니다.
- RFC 7838 — HTTP 대체 서비스. Alt-Svc는 URL이 표시하는 원본을 변경하지 않고 HTTP/3 엔드포인트를 광고합니다.
- RFC 8441 — HTTP/2로 웹소켓 부트스트래핑. Webship는 다운스트림 확장 CONNECT 협상 기반을 지원합니다. HTTP/1.1 업스트림이 HTTP/2 확장 CONNECT를 구현하는 척하지 않습니다; 지원되지 않는 업스트림 조합은 명시적으로 실패합니다.
- RFC 8470 — HTTP에서 초기 데이터 사용. Webship가 처리하지 않을 초기 요청은 안전하지 않은 재생 가정을 사용하여 처리되는 대신 425 Too Early 응답을 받습니다.
- RFC 8941 — HTTP를 위한 구조화된 필드 값. HTTP 우선순위 값은 구조화된 필드 사전 파싱을 사용합니다; 잘못된 선택적 필드는 전체가 무시됩니다.
- RFC 9110 — HTTP 의미론. 메서드, 상태 코드, 필드, 검증기, 전제 조건, 리디렉션, 콘텐츠 메타데이터, HEAD, CONNECT, OPTIONS 및 범위 의미론은 프로토콜 버전에 걸쳐 하나의 현재 계약을 공유합니다.
- RFC 9111 — HTTP 캐싱. Webship은 수정된 연령(corrected age), 명시적 신선도(explicit freshness), Vary, only-if-cached, must-revalidate, proxy-revalidate, 안전한 오래된 콘텐츠 사용(safe stale use), 그리고 유효한 URI 및 관련 URI의 무효화(invalidation)를 구현합니다.
- RFC 9112 — HTTP/1.1. 요청 라인, 필드, 본문 길이, 전송 인코딩, 청크, 트레일러, 지속성, 닫기 구분 규칙은 애플리케이션 전달 전에 적용됩니다.
- RFC 9113 — HTTP/2. 의사 필드 순서, 권한, 금지된 연결 필드, TE 제한, 스트림 생명주기, 흐름 제어, GOAWAY 및 오류 범위는 Webship가 소유한 H2 경로에서 처리됩니다.
- RFC 9114 — HTTP/3. Webship는 HTTP/3 서버에서 사용하는 요청, 제어 스트림, SETTINGS, 중요한 스트림, 취소, 스트림 대 연결 오류 경로를 소유합니다.
- RFC 9204 — QPACK: HTTP/3를 위한 필드 압축. 동적 테이블 용량은 광고된 한도로 제한되며, 명령 스트림은 용량이 0일 때도 파싱 가능하고, 잘못된 상태는 필수 QPACK 오류가 됩니다.
- RFC 9218 — HTTP를 위한 확장 가능한 우선순위 지정 체계. 긴급성과 점진적 전송은 우선순위 매개변수가 알려지지 않은 상태에서도 HTTP/3 스케줄링을 안내합니다.
- RFC 9220 — HTTP/3로 WebSockets 부트스트랩. Webship은 현대 터널링 프로토콜에서 사용되는 HTTP/3 확장-CONNECT SETTINGS 기반을 구현합니다; 이는 모든 가능한 CONNECT 프로토콜이 허용된다는 것을 의미하지 않습니다.
- RFC 9297 — HTTP 데이터그램 및 캡슐 프로토콜. WebTransport 세션은 제한된 캡슐 디코딩과 HTTP 데이터그램 연관을 사용하며, 알려지지 않은 캡슐은 파서 실패 대신 확장 지점으로 처리됩니다.
- RFC 9421 — HTTP 메시지 서명. 선택적 Ed25519 응답 출처는 TLS나 애플리케이션 인증을 대체하지 않고 Webship 릴리스 및 구성 식별을 포함할 수 있습니다.
- RFC 10008 — HTTP QUERY 메서드. Webship은 QUERY를 안전하고 멱등한 것으로 처리하며, 프록시를 통해 본문을 보존하고, 캐시 식별에는 본문과 표현 메타데이터를 포함하며, 휴리스틱 신선도를 금지하고, 조건부 및 범위 동작을 지원하며, 단순히 QUERY가 사용되었다고 해서 캐시를 무효화하지 않습니다.
QUIC 전송 및 혼잡 제어
- RFC 3465 — 적절한 바이트 계산을 이용한 TCP 혼잡 제어. 적절한 바이트 계산 논리는 Webship의 QUIC 구현에서 사용되는 NewReno 혼잡 제어 계열의 일부입니다.
- RFC 4303 — IP Encapsulating Security Payload. Webship은 IPsec ESP를 구현하지 않습니다; 그 대신 QUIC 패킷 중복 제거기는 RFC의 슬라이딩 윈도우 재전송 방지 기법을 구현 계보로만 사용합니다.
- RFC 5681 — TCP 혼잡 제어. 손실 및 순서 재배치 임계값은 QUIC가 TCP 관행을 기반으로 하는 기존 혼잡 제어 제약을 상속받습니다.
- RFC 6298 — TCP 재전송 타이머 계산. 평활 왕복 시간(Smoothed Round-Trip Time)과 분산 계산은 QUIC 복구 모델에 기여합니다.
- RFC 8312 — 장거리 고속 네트워크를 위한 CUBIC. 이것은 알고리즘 계보로서 보존된 초기 CUBIC 명세이며, RFC 9438이 현재 표준입니다.
- RFC 8899 — 데이터그램 전송을 위한 패킷화 계층 경로 MTU 발견. 구성 가능한 DPLPMTUD는 취약한 네트워크 계층 신호에 의존하지 않고 사용 가능한 QUIC 데이터그램 크기를 발견합니다.
- RFC 8999 — QUIC의 버전 독립 속성. 버전별 디코더가 실행되기 전에도 긴 헤더, 연결 ID, 버전 협상 및 고정 파싱은 안전하게 유지됩니다.
- RFC 9000 — QUIC: UDP 기반 다중화 및 보안 전송. 연결 ID, 스트림, 흐름 제어, 이동, 주소 검증, 재시도(Retry), 무상태(reset) 재설정, 전송 매개변수 및 종료 동작이 Webship의 HTTP/3 전송 기반을 형성합니다.
- RFC 9001 — QUIC을 보호하기 위해 TLS 사용하기. 초기 비밀, 패킷 보호, 헤더 보호, 재시도 무결성, 키 단계, TLS 통합은 QUIC-TLS 규칙을 따릅니다.
- RFC 9002 — QUIC 손실 감지 및 혼잡 제어. 패킷 번호 공간, 확인 응답, PTO, 손실 감지, 복구 및 혼잡 계산이 전송 신뢰성을 이끕니다.
- RFC 9221 — QUIC에 대한 신뢰할 수 없는 데이터그램 확장. 협상된 QUIC 데이터그램 프레임은 스트림 콘텐츠로 변환하지 않고 신뢰할 수 없는 WebTransport 트래픽을 전달합니다.
- RFC 9287 — QUIC 비트 그리싱. QUIC 비트 그리싱은 협상 안전성을 유지하면서 경화(ossification)를 줄입니다.
- RFC 9308 — QUIC 전송 프로토콜의 적용성. 제한된 유휴 시간과 배포 지침과 같은 운영 기본값은 Webship의 운용용 전송 정책을 안내합니다.
- RFC 9369 — QUIC 버전 2. 버전 2 패킷 유형, 초기 키, 재시도 무결성, 키 업데이트 및 버전 협상은 QUIC v1과 함께 구현됩니다.
- RFC 9438 — 빠르고 장거리 네트워크를 위한 CUBIC. 현재 CUBIC 표준은 Webship의 CUBIC 혼잡 제어기를 관리합니다; BBR 및 NewReno는 필요에 따라 선택할 수 있습니다.
TLS, 인증서 및 자동 인증서 관리
- RFC 3339 — 인터넷에서의 날짜와 시간: 타임스탬프. ACME 갱신 창은 상호 운용 가능한 인터넷 타임스탬프를 사용합니다.
- RFC 4648 — Base16, Base32, 및 Base64 데이터 인코딩. ACME JOSE 값과 WebSocket 핸드셰이크 자료는 필수 Base64 및 Base64url 알파벳과 패딩 규칙을 사용합니다.
- RFC 5280 — 인터넷 X.509 PKI 인증서 및 CRL 프로파일. 인증서 파싱 및 생성된 챌린지 인증서는 올바른 DNS 및 이진 IP subjectAltName 형식을 사용합니다.
- RFC 5869 — HMAC 기반 추출-확장 키 도출 함수. HKDF-SHA-256 및 HKDF-SHA-384 도출, 출력 범위를 포함하여, TLS 및 QUIC 키를 뒷받침합니다.
- RFC 6066 — TLS 확장. SNI는 DNS 식별자를 선택하며, 리터럴 IP 주소는 일반 HostName 형식에서 올바르게 제외됩니다.
- RFC 7301 — TLS 애플리케이션 계층 프로토콜 협상. ALPN은 TLS 경계에서 HTTP/1.1, HTTP/2, HTTP/3 및 분리된 ACME 챌린지 프로토콜을 선택합니다.
- RFC 7638 — JSON 웹 키 Thumbprint. ACME 계정 키 Thumbprint는 정규화된 JWK 형식에서 파생됩니다.
- RFC 7807 — HTTP API를 위한 문제 세부사항. Webship은 RFC 8555 ACME 서버에서 요구하는 문제 문서 형식을 사용합니다. 새로운 Problem Details 명세가 새로운 범용 API를 위해 이를 대체하지만, ACME의 규범적 의존성은 명시적으로 남아 있습니다.
- RFC 8446 — TLS 1.3. Webship은 세션 티켓, 키 업데이트, 알림, 초기 데이터 정책, QUIC 키 도출을 포함하여 공개 TLS에 TLS 1.3을 사용합니다.
- RFC 8555 — 자동 인증서 관리 환경. 계정, 주문, 인증, 챌린지, 완료, 인증서 다운로드 및 갱신 흐름은 제한된 입력 처리를 통해 자동화됩니다.
- RFC 8737 — ACME TLS-ALPN-01 챌린지. 챌린지 전용 TLS 경로는 acme-tls/1만 협상하며 필수적인 acmeIdentifier 인증서 확장을 제공합니다.
- RFC 8738 — ACME IP 식별자 검증 확장. Webship은 IPv4 및 IPv6 인증서 주문, 이진 IP SAN, IP TLS-ALPN-01 검증을 위한 역방향 주소 SNI를 지원합니다.
- RFC 9525 — TLS의 서비스 아이덴티티. DNS 이름과 IP 아이덴티티는 현재 서비스 아이덴티티 규칙에 따라 일치하며, IP 주소에 대한 와일드카드나 일반 이름 단축은 사용되지 않습니다.
- RFC 9773 — ACME 갱신 정보 확장. 갱신 창은 CA에서 제공될 수 있으며, 이를 통해 Webship은 하나의 고정된 로컬 일정 대신 안전하게 갱신을 분산시킬 수 있습니다.
WebTransport: 표준화된 내용에 대해 정확히
HTTP/3 위의 WebTransport는 53번째 RFC로 간주되지 않습니다. Webship 1.3.1 기준으로, 그 전송 맵핑은 여전히 draft-ietf-webtrans-http3-16입니다. Webship는 표준화된 HTTP/3, 확장 CONNECT, QUIC DATAGRAM, HTTP Datagram, 그리고 위에 언급된 캡슐 계층 위에 해당 초안을 구현합니다. 또한 WebTransport 스트림이 재설정될 때 신뢰할 수 있는 세션 식별 접두사를 유지하기 위해 필요한 협상된 RESET_STREAM_AT 확장도 구현합니다.
그 구분은 중요합니다. 초안을 RFC라고 부른다고 해서 표준 호환성이 향상되지는 않습니다. 표준 호환성은 초안을 명확히 추적하고, 이를 일반 HTTP 경로와 분리하며, 모든 확장을 협상하고, 모든 세션 자원을 제한하며, 취소 및 실패 동작을 테스트함으로써 향상됩니다.
왜 이러한 폭이 생산에서 중요한가
표준 버그는 거의 단독으로 발생하지 않습니다. 잘못된 HSTS 처리로 인해 캐시 경계가 넘어갈 수 있습니다. 잘못된 QPACK 명령은 관련 없는 요청을 종료시킬 수 있습니다. 안전하지 않은 초기 데이터 가정은 작업을 재실행할 수 있습니다. 요청 본문을 생략한 QUERY 캐시 키는 다른 쿼리의 결과를 반환할 수 있습니다. 트레일러를 제거하거나 취소를 잘못 처리하는 프록시는 애플리케이션 프로토콜을 조용히 변경할 수 있습니다.
Webship의 아키텍처는 이러한 것들을 연결된 관심사로 취급합니다. 파서 제한, 보안 검사, 캐싱, 리버스 프록시, 전송 상태 및 계측은 명시적인 계약을 공유합니다. 그 결과 하나의 서버가 각 모드에 대해 다른 올바름 정의를 제공하지 않고도 HTTP/1.1, HTTP/2, HTTP/3, 정적 전송, 리버스 프록시, 스트리밍, WebTransport 간을 이동할 수 있습니다.
주장을 확인하다
믿음으로 과장된 표현을 받아들이지 마십시오. [Webship 1.3.1 문서](/docs/1.3.1)를 읽고, 구성과 프로토콜 경계를 점검하며, 게시된 동작을 재현하십시오. 그런 다음 [Webship을 다운로드](/downloads)하고 시스템에 중요한 경계 사례를 테스트하십시오.