Chrome is marking DBSC sessions as session_ended during the refresh flow, even when the server correctly responds with a 403 Forbidden status and a valid Secure-Session-Challenge header in the expected RFC9651 Structured Field format.
Problem Description
During the DBSC refresh flow (Step 1: Challenge), Chrome sends a refresh request with Sec-Secure-Session-Id header, and the server responds with:
- Status Code:
403 Forbidden (as per W3C DBSC §8.8)
- Header:
Secure-Session-Challenge: "challenge_token";id="session_identifier"
- Body: Plain text
"OK"
- Headers:
Cache-Control: no-store, Content-Type: text/plain
However, Chrome's net-export logs show session_ended instead of proceeding to Step 2 (Proof).
Expected Behavior
According to W3C DBSC specification §8.8:
- Status
403: Chrome should retry with cached challenge
- Chrome should proceed to Step 2 by sending
Secure-Session-Response header with signed JWT
Actual Behavior
- Chrome receives the
403 response with Secure-Session-Challenge header
- Chrome marks the session as
session_ended instead of proceeding to Step 2
- No Step 2 request is made to refresh endpoint (no
Secure-Session-Response header sent)
Implementation Details
Challenge Header Format
The server constructs the Secure-Session-Challenge header as follows:
Secure-Session-Challenge: "DBSC-<random_string>";id="<session_identifier>"
Where:
challenge_token is a plain string (e.g., "DBSC-m74paggdrt")
session_identifier matches the session_identifier sent during registration
- Format follows RFC9651 Structured Fields:
"string-value";param="value"
Response Headers
HTTP/1.1 403 Forbidden
Content-Type: text/plain
Cache-Control: no-store
Secure-Session-Challenge: "DBSC-m74paggdrt";id="3ab57e6b-d886-4cc8-801c-ec1db4403ac9"
Access-Control-Allow-Origin: <origin>
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Secure-Session-Registration, Secure-Session-Challenge
Response Body
Questions
-
Session Identifier Matching: The id parameter matches the session_identifier from registration. Are there any additional requirements for this matching?
-
Response Format: Is there any requirement for the response body format beyond plain text? The spec mentions 403 but doesn't specify body requirements.
-
Timing: Could there be a timing issue where Chrome marks session_ended before processing the challenge header?
-
Error Handling: What specific conditions cause Chrome to mark a session as session_ended during the challenge step?
Additional Context
- The registration flow works correctly (Chrome successfully registers the session)
- The
session_identifier sent during registration matches the id parameter in the challenge header
- The issue occurs consistently, not intermittently
- Net-export logs confirm
session_ended status
Thank you for your assistance, if you want I can provide even further details!
Chrome is marking DBSC sessions as
session_endedduring the refresh flow, even when the server correctly responds with a403 Forbiddenstatus and a validSecure-Session-Challengeheader in the expected RFC9651 Structured Field format.Problem Description
During the DBSC refresh flow (Step 1: Challenge), Chrome sends a refresh request with
Sec-Secure-Session-Idheader, and the server responds with:403 Forbidden(as per W3C DBSC §8.8)Secure-Session-Challenge: "challenge_token";id="session_identifier""OK"Cache-Control: no-store,Content-Type: text/plainHowever, Chrome's net-export logs show
session_endedinstead of proceeding to Step 2 (Proof).Expected Behavior
According to W3C DBSC specification §8.8:
403: Chrome should retry with cached challengeSecure-Session-Responseheader with signed JWTActual Behavior
403response withSecure-Session-Challengeheadersession_endedinstead of proceeding to Step 2Secure-Session-Responseheader sent)Implementation Details
Challenge Header Format
The server constructs the
Secure-Session-Challengeheader as follows:Where:
challenge_tokenis a plain string (e.g.,"DBSC-m74paggdrt")session_identifiermatches thesession_identifiersent during registration"string-value";param="value"Response Headers
Response Body
Questions
Session Identifier Matching: The
idparameter matches thesession_identifierfrom registration. Are there any additional requirements for this matching?Response Format: Is there any requirement for the response body format beyond plain text? The spec mentions
403but doesn't specify body requirements.Timing: Could there be a timing issue where Chrome marks
session_endedbefore processing the challenge header?Error Handling: What specific conditions cause Chrome to mark a session as
session_endedduring the challenge step?Additional Context
session_identifiersent during registration matches theidparameter in the challenge headersession_endedstatusThank you for your assistance, if you want I can provide even further details!