Skip to content

HTTP Conformance

Introduction: The Essence of HTTP Conformance

Section titled “Introduction: The Essence of HTTP Conformance”

The Hypertext Transfer Protocol (HTTP) is often mistakenly viewed in practice as a simple transport protocol for JSON payloads. This misapprehension leads to architectures that ignore fundamental principles of the web, instead building complex, proprietary business logic to solve problems that the standard has long since addressed. The core of the protocol, defined in RFC 9110 (HTTP Semantics), is not a transport mechanism but a semantic framework—a common language and behavioral model for a globally distributed hypermedia system.12 RFC 9110 establishes the “overall architecture of HTTP” and defines the “common terminology”.123

Conformance in the context of RFC 9110 is therefore a profound contract. It demands adherence both to the message syntax (e.g., HTTP/1.1 or HTTP/2) and, crucially, to the semantics of the protocol elements.14 A client or server that sends syntactically correct messages but violates the defined semantics (e.g., using a “safe” GET request to delete data) will inevitably fail to interoperate with standard components.1

The architectural costs of non-conformance are immense. Every semantic deviation from the standard—be it the incorrect use of HTTP methods, the faulty interpretation of status codes, or the ignorance of Caching directives—must be compensated for by proprietary “application logic.” This logic must be individually implemented, maintained, and versioned in every client and every server. This creates extremely tight coupling, destroys interoperability, and leads to massive, long-term technical debt that undermines the entire system’s longevity, security, and scalability.

Conversely, conformance is the decisive enabler. Strict adherence to the standards is the explicit “entry ticket” to utilize a global ecosystem of highly optimized, generic intermediaries.25 Proxies, Content Delivery Networks ( CDNs), Web Application Firewalls (WAFs), and browser caches are all designed to understand and act upon the semantics of RFC 9110 “out-of-the-box.” Tim Berners-Lee himself, during the standardization of HTTP/1.1, emphasized the significant advantages in performance, security, and interoperability that result from conformance.6

The Internet Engineering Task Force (IETF) deliberately formalized this separation in modern HTTP specifications. The specifications were strategically split: RFC 9110 (Semantics) and RFC 9111 (Caching) are separate from the transport definitions in RFC 9112 (HTTP/1.1), RFC 9113 (HTTP/2), and RFC 9114 (HTTP/3).37 The purpose of this separation is to allow the transport “how” (the individual protocol versions) to evolve independently of the stable, underlying semantic “what” (the interaction model).3 For architects, this means: Adherence to RFC 9110 is more fundamental and more important to an application’s longevity than the choice between HTTP/2 or HTTP/3. A semantic violation is an architectural error that cannot be fixed by a transport upgrade.

The “out-of-the-box” benefits 8 that are often taken for granted—such as global scalability 9 or instant caching 10—are no accident. They are the direct and measurable result of adhering to this semantic contract. Non-conformance is therefore not just an implementation error 11; it is an active exclusion from the ecosystem of standardized web infrastructure.

The HTTP Standard’s Solution Framework: Categorized Mechanisms

Section titled “The HTTP Standard’s Solution Framework: Categorized Mechanisms”

The HTTP standard provides a comprehensive solution framework for the core problems of distributed systems. In practice, these solutions are often replaced by proprietary “bad application logic,” leading to the disadvantages previously described. The following analysis catalogs the key standard solutions offered by RFC 9110 and related specifications.

Solution Area 1: Unambiguous Semantics and State Transitions (Methods)

Section titled “Solution Area 1: Unambiguous Semantics and State Transitions (Methods)”

HTTP’s primary mechanism for defining the intent of a client request is its methods.1213 They are the contract for what kind of action the server is expected to perform. RFC 9110 defines clear semantic properties for these methods.

Safe Methods (Safe): Methods like GET, HEAD, and OPTIONS are defined as “safe.”1314 This is a guarantee from the client to the server that the request has no intended side effects on the server’s state. They are solely for retrieving information. This guarantee is used by intermediaries like crawlers or prefetching mechanisms. The anti-pattern of using GET for write actions (e.g., GET /deleteUser?id=123) 15 breaks this fundamental guarantee. A search engine crawler or an aggressive browser prefetcher, operating under the assumption that GET requests are safe, could unintentionally delete data on the server simply by “visiting” this link. The conformant use of DELETE or POST is thus a native, “out-of-the-box” defense against the normal behavior of web infrastructure.

Idempotent Methods (Idempotent): Methods like GET, HEAD, PUT, and DELETE are defined as “idempotent.”1314 Idempotency means that multiple identical requests have the same net effect on the server’s state as a single request.1314 The POST method is explicitly defined as not idempotent.1314

This distinction is not an academic nicety but a standard solution that replaces complex, client-side “application logic.” A common problem in distributed systems is handling network errors (e.g., a timeout) where the client does not know if its request reached the server.

Cacheable Methods (Cacheable): Methods like GET and HEAD are defined as primarily cacheable. POST can also be cacheable under certain conditions, but it is not in the default configuration of most intermediaries.1316

The following table summarizes the contractual obligations of HTTP method semantics according to RFC 9110.

Table 1: Semantic Properties of HTTP Methods (RFC 9110)

MethodPurpose (Simplified)Is SafeIs IdempotentPrimarily Cacheable
GETRetrieve a representationYesYesYes
HEADRetrieve only headers of a representationYesYesYes
POSTProcess a resource / create a subordinate resourceNoNo(Conditional)
PUT(Fully) replace or create a resourceNoYesNo
DELETEDelete a resourceNoYesNo
OPTIONSQuery communication options for a resourceYesYesNo
TRACEPerform a “loop-back” test of the requestYesYesNo
CONNECTEstablish a tunnel to the server 17NoNoNo

Data sources for Table 1: 131417

Solution Area 2: Reliable Communication and Error Handling (Status Codes)

Section titled “Solution Area 2: Reliable Communication and Error Handling (Status Codes)”

HTTP status codes are the server’s primary mechanism for communicating the result of the requested semantic action in a standardized way. They are divided into five classes that allow for immediate categorization of the outcome.181920

The most fundamental distinction the standard makes is that of responsibility for the error 21:

  • 2xx (Successful): The request was successful and understood.1819
  • 4xx (Client Error): The request itself is faulty (e.g., invalid syntax, resource not found, lacking permissions). The server could not or would not process the request. The client must not repeat the request without modification.18212223
  • 5xx (Server Error): The request was syntactically and semantically valid, but the server encountered an internal problem that prevented it from fulfilling the request.182122

This 4xx/5xx separation is not merely informative; it is a critical mechanism for automating the assignment of responsibility in distributed systems. Every “out-of-the-box” monitoring tool, API gateway, or observability stack relies on this semantic.

Furthermore, specific status codes define the next permissible steps in a protocol, acting as a machine-readable state machine:

  • 201 Created: Signals that a resource was successfully created. The response should include a Location header specifying the URI of the new resource.1519
  • 204 No Content: Signals success but informs the client that no response body will be sent, intentionally (e.g., after a DELETE request).22 The client does not need to wait for a body.
  • 401 Unauthorized: Signals that authentication is required. This response must include a WWW-Authenticate header that provides the “challenge” (i.e., the required authentication methods) to the client.125
  • 403 Forbidden: Signals that authentication was successful (or is not required), but the client lacks permission for the requested action.24 This is semantically and fundamentally different from 401.
  • 409 Conflict: Signals that the request could not be processed because it conflicts with the current state of the target resource (e.g., a versioning conflict).22

Solution Area 3: Performance and Scalability (Caching, RFC 9111)

Section titled “Solution Area 3: Performance and Scalability (Caching, RFC 9111)”

HTTP caching, defined in RFC 9111, is the standard solution for drastically reducing latency and network overhead.526 It is a local store for response messages.10 The standard defines a sophisticated, two-stage system that goes far beyond what most proprietary “in-app” caches provide.

Mechanism 1: Expiration This is the first stage of optimization. The server tells the cache (browser or intermediary) via the Cache-Control response header how long a representation is considered “fresh,” typically via max-age (e.g., Cache-Control: max-age=3600 for one hour).2728 As long as the response is fresh, it is served without any network request to the origin server.29 This completely eliminates both server load and network latency.30

Mechanism 2: Validation This is the second stage of optimization, which applies when the response is “stale” (expired). Instead of blindly re-requesting the entire resource, the cache must check with the server (“revalidate”).2930 To make this process efficient, the server provides “validators”:

  • ETag (Entity Tag): An opaque token that represents a specific version of the resource (e.g., a hash of the content).3031
  • Last-Modified: A timestamp of the last modification.31

The cache sends these validators in a conditional request (e.g., If-None-Match: "etag-value"). The server now performs a quick check:

  • If the resource has not changed, the server responds with 304 Not Modified. This response has an empty body.293031 The cache now knows its “stale” copy is “fresh” again and serves it.
  • If the resource has changed, the server responds with 200 OK and the new, complete resource.

This two-stage system is architecturally superior to implementing a proprietary “in-app” cache (e.g., in Redis). A typical in-app cache often only implements Stage 1 (Expiration). When the Redis entry expires, the server must regenerate the data (e.g., a 10 MB JSON document) and send the full response to the client. The HTTP model is more efficient: even if max-age (Stage 1) has expired, Stage 2 (Validation) can still save 10 MB of bandwidth by sending a 304 if the data has not factually changed.

The Cache-Control “API” The Cache-Control header is an “API” that allows the origin server to programmatically control the behavior of a complex, global ecosystem of intermediaries (CDNs, proxies).3233

  • private vs. public: The standard distinguishes between private caches (for a single user, e.g., a browser cache) and shared caches (for many users, e.g., a CDN, proxy).526 With Cache-Control: private, the server forbids a CDN from storing the response. With Cache-Control: public, it explicitly permits it.28
  • Security through Semantics (Authentication): The standard (RFC 9111) is “secure-by-default.” It mandates that a shared cache (CDN) must never store a response to a request containing an Authorization header, as it is by definition user-specific.526 This response may only be stored in a private cache (the user’s browser). A server can only override this behavior with explicit directives like public or s-maxage.5

Solution Area 4: Flexibility and Representation (Content Negotiation)

Section titled “Solution Area 4: Flexibility and Representation (Content Negotiation)”

Content Negotiation is the HTTP-conformant mechanism for serving different representations of the same resource under a single, stable URI.34 This solves the problem of different clients needing different formats (e.g., JSON vs. XML), languages (e.g., German vs. English), or encodings (e.g., Gzip vs. Brotli).

Server-driven Negotiation (Proactive Negotiation): This is the standard mechanism.34

  1. The client sends Accept headers in its request, listing its preferences and capabilities.
  • Accept: Defines the preferred media types (MIME types). Example: Accept: application/json, application/xml;q=0.8 (meaning: “I prefer JSON, but XML is acceptable with a priority of 0.8”).353637
  • Accept-Language: Defines the preferred languages. Example: Accept-Language: de-DE, en-US;q=0.7.38
  • Accept-Encoding: Defines the supported compression algorithms. Example: Accept-Encoding: gzip, br.3438
  1. The server analyzes these headers, compares them with its available representations, and selects the best matching variant.
  2. The server sends the selected representation back, informing the client of its choice with response headers like Content-Type, Content-Language, and Content-Encoding.3538

Reactive Negotiation: If the server cannot find a suitable representation, it can respond conformantly with 406 Not Acceptable or offer a list of available options with 300 Multiple Choices.34

This standard mechanism is superior to “bad application logic,” which typically solves the same problem using proprietary URL parameters (e.g., ?format=json) or URI structure (e.g., /resource.json vs. /resource.xml).

The question of why negotiation is superior to a URL parameter is answered clearly in the technical community: ” Standardization.”39 A generic client understands Accept headers “out-of-the-box.” It does not understand a proprietary ?format= parameter. By adhering to the standard, the resource remains accessible at a stable URI for any conformant client (including future, unknown clients) without them needing to know the API’s proprietary conventions.39

Furthermore, using Accept decouples the server’s evolution from the client base. A server (V1) might, for example, only serve XML. A client (V1) sends Accept: application/xml. Later, the server (V2) is updated to also serve JSON. The old client (V1) continues to work unchanged, as its request is still served correctly. A new client (V2) can now send Accept: application/json and receive the more modern format. The URI /resource/123 remains stable for both clients.34 This prevents the need for hard API versioning (e.g., /v2/...).

Solution Area 5: Security and State (Authentication and State Management)

Section titled “Solution Area 5: Security and State (Authentication and State Management)”

Part A: HTTP Authentication (RFC 9110) Contrary to the assumption that HTTP is designed only for cookie-based authentication, the standard (historically RFC 7235, now integrated into RFC 9110) defines a powerful, schema-agnostic framework for authentication.1440414243 It is a stateless challenge-response mechanism.404144

The standard flow is as follows 254144:

  1. Anonymous Request: The client requests a protected resource (e.g., GET /admin).
  2. Server Challenge: The server rejects the request with 401 Unauthorized. It must include a * *WWW-Authenticate** header in this response.45 This header defines the “challenge”—the methods the server accepts (e.g., WWW-Authenticate: Basic realm="Admin Area" or WWW-Authenticate: Bearer for tokens).
  3. Client Response: The client (e.g., a browser) can now prompt the user for credentials. It repeats the request, adding the Authorization header with the credentials in the format requested by the server (e.g., Authorization: Basic YWxhZGRpbjp...).146

The advantage of this framework is its flexibility. The server can offer multiple schemes to the client (e.g., WWW-Authenticate: Digest..., WWW-Authenticate: Bearer...).4547 The client chooses the most secure scheme it understands.4546

“Bad application logic” reinvents this framework, typically through a proprietary header (e.g., X-Api-Key). This breaks interoperability with standard tools. A browser or a tool like curl understands the 401/WWW-Authenticate flow “out-of-the-box” and can react accordingly (e.g., with a password prompt).41 These tools have no knowledge of a proprietary X-Api-Key scheme.

Part B: HTTP State Management (RFC 6265 - Cookies) Since HTTP itself is a stateless protocol 1, RFC 6265 (HTTP State Management Mechanism) is the standard that allows a server to store state in the user agent (browser) to manage a “stateful session.”48495051

The standard defines not only the Set-Cookie and Cookie headers 4952 but also—crucially—the security attributes that serve as standard solutions for well-known attack vectors:

  • Secure attribute: Ensures the cookie is only sent over “secure” channels (i.e., HTTPS).5354 This is the standard solution against sniffing session cookies in insecure networks.
  • HttpOnly attribute: Prevents the cookie from being accessed via client-side scripts (i.e., document.cookie).5455 This is the primary, “out-of-the-box” line of defense against session cookie theft via Cross-Site Scripting (XSS) attacks.55
  • SameSite attribute (Lax, Strict, None): Controls whether a cookie is sent with cross-site requests (i.e., requests from a different domain).545657 This is the primary, “out-of-the-box” line of defense against Cross-Site Request Forgery (CSRF) attacks.58

Non-conformant implementations (e.g., setting a session cookie without HttpOnly and SameSite=Strict) actively create the attack vectors for XSS and CSRF.5960 The “application logic” must then arduously mitigate these threats again, typically by implementing Content Security Policies (CSP) and anti-CSRF tokens. Conformance with RFC 6265 is the first, cheapest, and strongest line of defense that the standard provides natively.

Analysis: HTTP Anti-Patterns and “Bad Application Logic”

Section titled “Analysis: HTTP Anti-Patterns and “Bad Application Logic””

The refusal to use standard solutions leads to a series of well-known anti-patterns.1561 These anti-patterns are often a direct symptom of “business logic” or “bad application logic” having taken control of the protocol’s behavior.

Anti-Pattern 1: The “200 OK” Lie (Ignoring Status Codes)

Section titled “Anti-Pattern 1: The “200 OK” Lie (Ignoring Status Codes)”

This is one of the most harmful anti-patterns.15 Instead of using the semantically correct status code, the API always returns HTTP 200 OK. The “actual” status is wrapped in a proprietary JSON envelope in the body.226263

Drawbacks (Technical Debt):

  • Breaks the Ecosystem: This anti-pattern blinds every standard tool (monitoring, caching, proxies, gateways).24
  • Faulty Monitoring: Monitoring systems see 100% 200 OK responses and incorrectly report a 100% success rate. The system is down, but the dashboard is “green.”
  • Faulty Caching: A CDN or proxy configured to cache 200 responses might incorrectly cache this error message and serve it to other users.6465
  • Complex Clients: The client must parse the body of every 200 response to find out if the request was actually successful.22 This doubles the error-handling logic (once for network/HTTP errors, once for the proprietary body error).

Anti-Pattern 2: Method Tunneling (Ignoring Semantics)

Section titled “Anti-Pattern 2: Method Tunneling (Ignoring Semantics)”

This anti-pattern treats HTTP as a “dumb” transport protocol in an RPC (Remote Procedure Call) style.61 Every action, regardless of its semantics (read, write, delete), is tunneled over a single method (usually POST) to a single endpoint (e.g., /api).15

Drawbacks (Technical Debt):

  • Total Loss of Caching: Since every action is a POST, nothing can be cached by standard caches (browser, CDN, proxy), as POST requests are generally not considered cacheable.6768 Every single read request hits the origin server.
  • Loss of Idempotency: The client loses the “safe retry” guarantee for idempotent actions (like DELETE), as POST is not idempotent.13
  • Loss of “Safe” Guarantees: If GET is misused for write operations, there is a risk of unintentional data modification by crawlers.15
  • Workarounds: This anti-pattern is so common that workarounds like the X-HTTP-Method-Override header 6970 were invented to bypass firewalls that only allow POST—a “workaround for a workaround” that completely breaks semantics.

Anti-Pattern 3: “In-App” Caching (Ignoring RFC 9111)

Section titled “Anti-Pattern 3: “In-App” Caching (Ignoring RFC 9111)”

Out of ignorance or distrust of HTTP caching, developers implement their own proprietary caching layers within the application (e.g., with Redis or in-memory maps) 71, while completely ignoring HTTP caching headers.1561

Drawbacks (Technical Debt):

  • Reinventing the Wheel: Implementing a correct, thread-safe cache invalidation strategy is one of the hardest problems in computer science and is being needlessly reimplemented here.
  • Inefficient: As explained in II.3, this approach almost always lacks the superior two-stage (Expiration + Validation) system of the HTTP standard.30
  • Invisible to Intermediaries: The most severe drawback. The in-app cache is invisible to the entire ecosystem. A user’s request from Asia must cross the globe, pass through the CDN and proxy (which cannot cache), and hit the origin server in Europe, just for the in-app cache to serve the response. A conformant Cache-Control header would have allowed the CDN in Asia to serve the response in milliseconds.10

Anti-Pattern 4: Insecure State Management (Ignoring RFC 6265)

Section titled “Anti-Pattern 4: Insecure State Management (Ignoring RFC 6265)”

This anti-pattern consists of setting authentication or session cookies without using the security attributes provided by the standard.5455

Drawbacks (Technical Debt):

  • Direct Attack Vectors: This non-conformance is not a theoretical weakness; it is the vulnerability.
  • XSS Vulnerability: The absence of HttpOnly allows an attacker who finds an XSS flaw to steal the cookie via JavaScript (document.cookie) and take over the user’s session.5559
  • CSRF Vulnerability: The absence of SameSite allows an authenticated user’s browser to send the cookie with a request from a malicious site (e.g., in an <img> tag or form), leading to a Cross-Site Request Forgery.5860
  • Increased Complexity: The “application logic” must now re-implement this standard defense, for example, by implementing anti-CSRF tokens—a solution that the SameSite attribute would have solved “out-of-the-box” and more robustly.

Table 2: Comparison: “Application Logic” vs. “HTTP Standard Solution”

Section titled “Table 2: Comparison: “Application Logic” vs. “HTTP Standard Solution””

This table summarizes the direct confrontation between common proprietary workarounds and the superior standard solutions.

ProblemAnti-Pattern / “Bad Application Logic”Conformant HTTP Solution (RFC 9110/9111/6265)“Out-of-the-Box” Benefit of Conformance
Error MessageHTTP 200 OK + { "success": false } 22HTTP 4xx (e.g., 400, 404) or 5xx 22Automatic monitoring, alerting, client handling, no Caching of errors 2465
State-changing ActionPOST /api {"action": "deleteUser"} 15DELETE /users/{id}Idempotency (“safe retry”) 13, CDN/proxy invalidation 68, semantic clarity
Data CreationPOST /api {"action": "createUser"}POST /users (leading to 201 Created + Location header) 19Discovery of the new resource, semantic clarity 15
Data Retrieval (Caching)POST /api {"action": "getUser"} OR GET /users/{id} (no cache headers) 15GET /users/{id} + Cache-Control: max-age=... + ETag: "..." 2630CDN, proxy & browser caching (Expiration) 28 AND bandwidth saving (Validation with 304) 30
Format SelectionProprietary parameter (e.g., ?format=json) or URI (.json)Accept: application/json header 3435Stable URIs, decoupling of clients, interoperability with generic tools 3439
Session Security (CSRF)Set-Cookie: session=... (no SameSite) + Anti-CSRF token in app logicSet-Cookie:...; SameSite=Strict 56Native, robust CSRF protection directly in the browser, no complex token logic needed 54
Session Security (XSS)Set-Cookie: session=... (no HttpOnly) + Content Security Policy (CSP)Set-Cookie:...; HttpOnly 54Native protection against cookie theft via JavaScript, first line of defense 55

The Multiplier Effect: “Out-of-the-Box” Benefits of Conformance

Section titled “The Multiplier Effect: “Out-of-the-Box” Benefits of Conformance”

Adherence to HTTP semantics is not an academic exercise 11 but a fundamental architectural investment. The “cost” of adherence (i.e., correctly setting headers and using methods/status codes) unlocks an ecosystem of generic, highly optimized intermediaries.232 The performance of these standard components (CDNs, proxies, browsers) surpasses that of any proprietary “in-app” solution by orders of magnitude.

The “out-of-the-box” benefits 8 are the direct result of this leverage. Intermediaries, from an IBM Proxy Server 32 to a global CDN like Cloudflare 65, are programmed to strictly interpret the semantics of RFC 9110 and RFC 9111.

Consider two scenarios:

  • Scenario A (Non-conformant): An API uses Anti-Patterns 1 (errors as 200) and 2 (everything over POST). An expensive, global CDN is placed in front of this API. The result: The CDN is useless. Every single request is a POST, is classified as “not cacheable” (Cache-Miss), and must be forwarded to the origin server.6768 The CDN cannot distinguish between success and failure (everything is 200).65 The developer has disabled a global infrastructure worth millions.
  • Scenario B (Conformant): An API uses GET /resource with Cache-Control: public, max-age=60 28 and an ETag.30 The CDN serves 99.9% of requests globally from its edge locations without contacting the origin server.10 After 60 seconds, it validates efficiently with If-None-Match and a 304.30 The server load collapses.

The only difference between global failure and global scalability in this case was HTTP conformance.

Benefit 1: Transparent Scalability (CDNs & Proxies)

Section titled “Benefit 1: Transparent Scalability (CDNs & Proxies)”

Intermediaries use HTTP semantics for far more than just caching 200 OK responses:

  • Method Caching: They aggressively cache GET and HEAD.1668 They know that PUT and DELETE change state and, upon arrival, automatically invalidate the cached GET responses for that resource.2968 An API that only uses POST robs the CDN of this cache invalidation capability.
  • Status Code Caching (Negative Caching): CDNs 65 and proxies 32 don’t just cache success. They conformantly cache 301 Moved Permanently (often for a long time) and 404 Not Found (typically for a short time, e.g., 3 minutes).6572 This is a critical “out-of-the-box” protection mechanism that shields the origin server from repeated, pointless requests for non-existent resources (e.g., during a denial-of-service attack or from a faulty client). An API that masks errors as 200 OK loses this protection.
  • Authentication Caching (Security Function): As detailed in II.3, the default behavior of a shared cache (CDN) is security-critical: It must not store a response to a request with an Authorization header, as it could contain private data.526 “Bad application logic” (e.g., passing an API key or session token as a URL parameter) bypasses this built-in protection. The CDN does not see the Authorization header, incorrectly treats the request as anonymous and public, and caches the private response. The next user to request the same URL receives the previous user’s private data (Cache Poisoning). Conformance (using the Authorization header) prevents this massive data leak “out-of-the-box.”

Benefit 2: Increased Security and Resilience (WAFs & Studies)

Section titled “Benefit 2: Increased Security and Resilience (WAFs & Studies)”

Adherence to HTTP specifications is not just a formality; it is a fundamental security practice. Web Application Firewalls (WAFs) and API gateways use HTTP semantics as a first line of defense to detect anomalies (e.g., a GET request with a body, which could indicate a smuggling attack). A non-conformant application is far more difficult for a WAF to protect, as it cannot distinguish “normal” traffic from “abnormal” traffic.

The need for conformance is not just theoretical. Empirical studies “harden” this argument by demonstrating the widespread prevalence of non-conformance and its direct security implications.

Evidence 1: CISPA-Studie (2024) - HTTP Conformance A systematic analysis of HTTP conformance and its security impacts 7 extracted 106 testable rules from the core RFCs (9110-9113, 6265 etc.) and tested them against real servers.

  • Result: Conformance is extremely low. “Most HTTP systems break at least one rule,” and “more than half of all rules were broken at least once.”7
  • Consequences: These violations are not harmless; they lead directly to known security vulnerabilities 7:
    • HTTP Request Smuggling (HRS): Caused by semantic violations such as sending a body in a 304 Not Modified response, “incorrect whitespace” in headers, or “forbidden headers” (e.g., Content-Length in a 204 response). These violations lead to parser desynchronization between a proxy and the backend server.7
    • Cross-Site Scripting (XSS): Caused by a “missing Content-Type header.” When this header is missing, browsers are forced to perform “MIME-sniffing,” which can lead to an uploaded file (e.g., an image) being misinterpreted as HTML or script and executed.7
    • Security Policy Bypass: Caused by “duplicate headers” (e.g., two Strict-Transport-Security headers). Different intermediaries (browser, proxy) may pick the first or the last header, leading to inconsistent and potentially insecure processing.7
    • Illegal Characters: Many servers (7 of 9 tested) failed to correctly reject requests with illegal characters (like CR, LF, NUL) in headers with 400 Bad Request, which can also lead to smuggling attacks.7

Evidence 2: Studie “Non-compliant and Proud” (2008) This earlier study also confirmed the widespread nature of non-conformance, particularly in the implementation of HTTP methods. It concluded that many websites are “non-compliant out of choice, not necessity”—the servers could be conformant but are not, due to misconfigurations.73

Taken together, these studies prove that adherence to the specifications is a native, “out-of-the-box” defense against entire classes of complex protocol attacks (like HRS). Non-conformance is an invitation for these attacks.

Table 3: Evidence-Based Risks of Non-Conformance (based on studies)

Section titled “Table 3: Evidence-Based Risks of Non-Conformance (based on studies)”

This table links the rule violations observed in research 7 directly to the resulting security vulnerabilities and the standard semantics that were violated.

Observed Non-Conformance 7Violated Semantics (RFC)Potential Security Impact (Out-of-the-Box Loss)
Body in 304 Not Modified responseRFC 9110 (Semantics: 304 must not have a body)HTTP Request Smuggling (HRS) via parser desynchronization 7
Incorrect Whitespace (e.g., in header names)RFC 9110 / 9112 (ABNF syntax)HTTP Request Smuggling (HRS), parser confusion, filter bypass 7
Missing Content-Type headerRFC 9110 (Semantics: Define content semantics)Cross-Site Scripting (XSS) via browser MIME-sniffing 7
Duplicate Security Headers (e.g., Strict-Transport-Security)RFC 9110 (Header field definitions)Inconsistent security policy, bypass of protections 7
Illegal Characters (CR, LF, NUL) in header valuesRFC 9110 (Semantics: Must be rejected as 400)HTTP Request Smuggling (HRS), injection attacks 7

Summary Analysis and Architectural Recommendations

Section titled “Summary Analysis and Architectural Recommendations”

The analysis presented shows that HTTP conformance, particularly adherence to the semantics of RFC 9110, is not an ” academic exercise” 11 or technical dogma. It is a deliberate and fundamental architectural decision in favor of robustness, longevity 3, security, and scalability.9

The “business logic” or “bad application logic” observed by the querent, which leads to the bypassing of HTTP standards, is almost invariably a more expensive, proprietary, error-prone, and lower-performance reinvention of an already existing, highly optimized, and globally understood standard function.

  1. Conformance Resolves Complexity: The standard semantics for idempotency (RFC 9110) 13, caching (RFC
  1. 2630, and state management security (RFC 6265) 54 eliminate the need for complex, proprietary client logic (e.g., “safe-retry” checks, anti-CSRF tokens, in-app caches).
  1. Conformance is the Key to Scalability: The “out-of-the-box” benefits of a global ecosystem of intermediaries ( CDNs, proxies, browsers) 832 are directly tied to semantic adherence. Non-conformant APIs (e.g., through method tunneling or 200 OK error messages) disable this infrastructure.226567
  2. Conformance is an “Out-of-the-Box” Security Feature: As empirical studies demonstrate 7, strict adherence to protocol semantics (e.g., correct length specifications, no bodies in 304 responses, correct cookie attributes) is a native line of defense against entire classes of attacks like HTTP Request Smuggling and Cross-Site Scripting.

The refusal to be HTTP-conformant is, ultimately, a refusal to leverage the benefits of a globally scaled, highly secure distributed system optimized for over 30 years.6 It is the equivalent of provisioning a high-performance CDN 74 and then, through POST method tunneling 15, effectively degrading it into a simple, expensive load balancer.

Adherence to HTTP semantics, as laid out in RFC 9110, is not an obstacle to implementing business logic; it is the indispensable foundation upon which professional, future-proof, and scalable web architectures are built.


  1. RFC 9110: HTTP Semantics 2 3 4 5 6 7 8

  2. Information on RFC 9110 » RFC Editor 2 3 4

  3. RFC 9110 - HTTP Semantics - IETF Datatracker 2 3 4

  4. RFC 9110 - HTTP Semantics - IETF Datatracker 2

  5. RFC 9111 - HTTP Caching - IETF Datatracker 2 3 4 5 6

  6. World Wide Web Consortium Supports HTTP/1.1 Reaching IETF Draft Standard - W3C 2

  7. Who’s Breaking the Rules? Studying Conformance to the HTTP … 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

  8. What is OOTB (Out of the Box) Solutions? 2 3

  9. Was ist Skalierbarkeit in der IT? Kurz und einfach erklärt - RNT | Rausch 2

  10. Was ist Web-Caching und wie funktioniert es? - Bluehost 2 3 4

  11. HTTP Compliance and W3C QA 2 3

  12. What are HTTP Methods (GET, POST, PUT, DELETE) - Apidog

  13. HTTP request methods - HTTP | MDN 2 3 4 5 6 7 8 9 10 11

  14. Idempotent Requests in HTTP - Fullstack.wiki 2 3 4 5 6

  15. REST Anti-Patterns - InfoQ 2 3 4 5 6 7 8 9 10 11

  16. HTTP Caching and Proxy Behavior - OpenStack Specifications 2

  17. CONNECT request method - HTTP - MDN Web Docs 2

  18. HTTP Status Codes: All 63 explained - including FAQ & Video - Umbraco 2 3 4

  19. HTTP response status codes - MDN Web Docs - Mozilla 2 3 4

  20. List of HTTP status codes - Wikipedia

  21. Status codes in HTTP - W3C 2 3

  22. What Are HTTP Status Codes? Complete Guide - Postman Blog 2 3 4 5 6 7 8 9 10

  23. HTTP Status Codes - REST API Tutorial 2

  24. The importance of HTTP status codes to REST-based APIs - Treblle 2 3 4

  25. 401 Unauthorized - HTTP - MDN Web Docs 2

  26. RFC 9111: HTTP Caching 2 3 4 5 6 7

  27. Cache-Control header - HTTP - MDN Web Docs

  28. What is cache-control? | Cache explained - Cloudflare 2 3 4

  29. ETag update after resource modification - Stack Overflow 2 3 4

  30. ETags: What they are, and how to use them | Fastly 2 3 4 5 6 7 8 9 10 11

  31. HTTP caching - MDN Web Docs - Mozilla 2 3

  32. Overview of proxy server caching - IBM 2 3 4 5

  33. HTTP Proxy Caching — Apache Traffic Server documentation

  34. Content negotiation - HTTP | MDN 2 3 4 5 6 7

  35. Accept header - HTTP - MDN Web Docs 2 3

  36. Content Negotiation - Apache HTTP Server Version 2.4

  37. Content Negotiation in a REST API

  38. Content Negotiation in ASP.NET Web API - Microsoft Learn 2 3

  39. Why would HTTP content negotiation be preferred to explicit parameters in an API scenario? 2 3

  40. RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication - IETF Datatracker 2

  41. HTTP authentication - MDN Web Docs 2 3 4

  42. HTTP Authentication : Methods and Strategies to Protect your Application - Medium

  43. Information on RFC 7235 - » RFC Editor

  44. WWW-Authenticate header - HTTP | MDN 2

  45. WWW-Authenticate header - HTTP - MDN Web Docs 2 3

  46. Authorization header - HTTP - MDN Web Docs - Mozilla 2

  47. Understanding HTTP Authentication - WCF - Microsoft Learn

  48. HTTP cookie - Wikipedia

  49. Information on RFC 6265 - » RFC Editor 2

  50. Cookies: HTTP State Management Mechanism

  51. Using HTTP cookies - MDN Web Docs - Mozilla

  52. RFC 6265: HTTP State Management Mechanism

  53. RFC 6265 - HTTP State Management Mechanism - IETF Datatracker

  54. Understanding Secure Cookies | BrowserStack 2 3 4 5 6 7

  55. Securing Cookies Using HTTP Headers - Infosec Institute 2 3 4 5

  56. SameSite Cookie Attribute explained 2

  57. SameSite-Cookies | Articles - web.dev

  58. XSS vs CSRF | Web Security Academy - PortSwigger 2

  59. CSRF vs. XSS - open-appsec 2

  60. XSS vs CSRF: Key Differences & How They Work - Invicti 2

  61. REST anti-patterns - Marcelo Cure - Medium 2 3

  62. When 200 OK Is Not OK - Unveiling the Risks of Web Responses In API Calls - Graylog

  63. Returning http 200 OK with error within response body - Stack Overflow

  64. Caching overview | Cloud CDN - Google Cloud Documentation

  65. Cache by status code - Cloudflare Docs 2 3 4 5 6 7

  66. Understanding and Using HTTP Methods: GET, POST, PUT, DELETE | by August - Medium

  67. what does cache means in POST and GET - Stack Overflow 2 3

  68. What data is cached by web proxy server(or other http caches)? - Stack Overflow 2 3 4 5

  69. Tunneling HTTP verbs - OneDrive API - Microsoft Learn

  70. HTTP Verb Tunnelling - Fano Framework

  71. Introduction to antipatterns | Apigee - Google Cloud Documentation

  72. CDN:Configure TTL for HTTP status code - Alibaba Cloud

  73. Non-compliant and Proud: A Case Study of HTTP Compliance - ResearchGate

  74. Common CDN issues and how to fix them - Cloudflare