Request Investigator · Case 02
The page loaded, but the data did not
Start with the observed symptom. Inspect evidence, state what it proves, and choose a useful next check.
Observed symptom
Start with what the user can see
The product page shell and navigation appear, but the product area says “We could not load this product.”
All requests, addresses, identifiers and logs in this exercise are illustrative. Nothing connects to a real service, and no result is saved.
- Browser documentRequests and renders the HTML shell
- Page JavaScriptStarts a separate same-origin API request
- API authenticationChecks the supplied session identifier
- Product handlerRuns only after required identity checks
Scenario assumptions and boundaries
This illustrative application serves HTML and a same-origin JSON API from app.example.com. Its API authenticates requests with a cookie named session. A valid cookie must map to an active server-side session before authorization runs. For this case, a failed session lookup returns 401 with a Session challenge. Other applications may use tokens, redirects or different status behavior.
Compare the browser requests
The Network panel records more than one request. Inspect the document and API entries independently.
Document requestInspect evidence
Document request — illustrative evidencetext Illustrative browser Network entry GET https://app.example.com/products/42 Type: document Status: 200 OK Content-Type: text/html Transferred: 8.4 kBObservation: the initial HTML document returned successfully. Inference: the browser could display the page shell. Unknown: whether later requests made by the page also succeeded.
Page-data requestInspect evidence
Page-data request — illustrative evidencetext Illustrative browser Network entry GET https://app.example.com/api/products/42 Type: fetch Status: 401 Unauthorized WWW-Authenticate: Session realm="codewise-example" X-Request-ID: cw-401-02 Response: {"error":"authentication_required"}Observation: a separate same-origin fetch reached the API and received 401. Inference: this application did not accept valid authentication credentials for this API request. Unknown: whether credentials were absent, sent but unrecognized, expired, or rejected for another authentication reason.
Decision 1
What does “the page loaded” prove?
Choose the strongest conclusion supported by the two Network entries.
The 200 document means every request required by the page succeeded.
The document and API are separate HTTP exchanges. The document returned 200 while the fetch returned 401.
What would support it: Successful Network entries for the page's required API and resource requests would be needed to support this broader claim.
You can close this and inspect another hypothesis. No score is recorded.The HTML document succeeded; the separate API request reached an authentication boundary and failed there.
Supported. These are separate HTTP exchanges: the visible shell came from the successful document response, while the product data depends on a later request with its own status and evidence.
You can close this and inspect another hypothesis. No score is recorded.The browser could not parse or render the HTML document.
The shell and navigation are visible, and the document returned 200. That does not fit a document parsing failure.
What would support it: A blank or malformed document together with parsing or rendering diagnostics would support this direction.
You can close this and inspect another hypothesis. No score is recorded.The user is authenticated but lacks permission to view product 42.
A 401 in this application signals that authentication was not accepted. We do not yet know whether authorization ran.
What would support it: An accepted identity followed by an authorization decision—commonly a correlated server trace and often a 403 response—would support this claim.
You can close this and inspect another hypothesis. No score is recorded.Inspect the authentication boundary
Use the request ID to compare what the browser sent with what the API accepted.
API request headersInspect evidence
API request headers — illustrative evidencetext Illustrative browser Network entry — secret value redacted GET /api/products/42 Cookie: session=[redacted] Sec-Fetch-Site: same-origin X-Request-ID: cw-401-02Observation: a session cookie was present on this API request. Inference: “the browser sent no cookie” is not supported. Unknown: whether its value names an active server-side session or why it might not.
Correlated authentication recordInspect evidence
Correlated authentication record — illustrative evidencetext Illustrative authentication log — normalized fields request_id=cw-401-02 credential_source=cookie cookie_present=true session_lookup=not_found authorization_check=not_run status=401Observation: this application received the cookie but found no active matching session, so authorization did not run. Inference: the first uncertainty is session recognition, not product permission. Unknown: whether the session expired, was invalidated, points at a different session store, or was never created there.
Decision 2
What should you inspect next?
Revise your hypothesis using both the request headers and correlated authentication record.
Change CORS settings because the browser blocked the request.
The same-origin request reached the API and exposed a 401 response. This evidence does not show a browser CORS block.
What would support it: A browser CORS diagnostic or blocked response would be needed to investigate that boundary.
You can close this and inspect another hypothesis. No score is recorded.Fix cookie attachment because no session cookie was sent.
The Network entry explicitly shows a redacted session cookie on this request.
What would support it: An absent Cookie header, together with cookie scope or credentials-mode evidence, would support this hypothesis.
You can close this and inspect another hypothesis. No score is recorded.Correlate the session identifier with session creation, expiry/invalidation and the session store used by this deployment.
Useful next check. It can distinguish expiry or invalidation from a store/configuration mismatch without treating the secret value as safe log data.
You can close this and inspect another hypothesis. No score is recorded.Change the user's product permission because authorization denied access.
The correlated record says authorization did not run; the session lookup failed first.
What would support it: An accepted session followed by an explicit authorization denial would be required to investigate permissions.
You can close this and inspect another hypothesis. No score is recorded.Write the investigation result
A useful report separates observations from remaining possibilities. Reveal this one after you have formed your own summary.
Reveal the investigation summary
- Last confirmed successful boundary
- The HTML document loaded, and the later API request reached the API authentication boundary.
- First observed failure or uncertainty
- The API did not find an active session matching the cookie supplied with the data request; authorization was not reached.
- Evidence supporting the conclusion
- 200 document entry, separate 401 fetch with request ID cw-401-02, Cookie header present, and the correlated session_lookup=not_found record.
- Plausible causes still open
- Session expiry or invalidation, a session-store/configuration mismatch, or an identifier never created in the store used by this deployment.
- Next useful check
- Safely correlate the session identifier with session creation and expiry/invalidation records and confirm which session store the API deployment uses.
Unseen transfer challenge
Use the method on a different boundary
This is a new illustrative incident. Work from its evidence before comparing your reasoning with the model report.
Start the transfer challenge
The project page appears, but opening its settings shows “You do not have access.” Inspect the correlated evidence for this particular application.
Application rules for this exercise: project settings require the project_admin role. Browser and server records can be correlated only when their request identifiers match. Treat the fields below as observations from this illustrative application, not as a universal explanation for every 403 response.
Illustrative browser Network entries
GET /projects/atlas 200 OK (document)
GET /api/projects/atlas/settings 403 Forbidden (fetch)
X-Request-ID: cw-transfer-403
Illustrative correlated authorization record
request_id=cw-transfer-403
identity=user-17
authentication=accepted
resource=project:atlas/settings
required_role=project_admin
granted_roles=project_member
authorization=deniedWrite a brief investigation note before revealing the model report. Your text remains in this browser page, is not submitted, and disappears when you reload.
Reveal the model investigation report
A 403 status alone does not prove this explanation. In this exercise, the matching request ID and correlated policy record support the case-specific inference below.
- Definitely worked
- The document loaded, the later fetch reached the application, and this application's correlated record says identity user-17 was authenticated.
- Failed or unknown
- Authorization to project:atlas/settings was denied because the required project_admin role was not present. The evidence does not tell us whether the policy or the user's recorded membership is correct.
- Next useful check
- Inspect the policy inputs and the source of project membership for user-17, then confirm whether the route really requires project_admin. This distinguishes a correct denial from stale role data or a misconfigured policy.
Understand the boundaries
References & further reading
References & further reading5 sourcesPrimary standards and official documentation used for this lesson.
- RFC 9110: HTTP Semantics — 401 Unauthorized (opens in a new tab)
IETF
Defines 401 and its authentication-challenge requirement.
- RFC 9110: HTTP Semantics — 403 Forbidden (opens in a new tab)
IETF
Defines 403 semantics; the transfer challenge relies on correlated evidence for its case-specific authorization conclusion.
- Fetch Standard — credentials (opens in a new tab)
WHATWG
Defines request credential modes and how same-origin requests handle credentials.
- Cookie header (opens in a new tab)
MDN Web Docs
Explains the Cookie request header; the example redacts its illustrative value.
- Session Management Cheat Sheet (opens in a new tab)
OWASP Cheat Sheet Series
Supports the distinction between a client-held session identifier and server-side session state.