Status: normative for every apps/* component (PLAN item 69).
- Memory only — held by
@starter/contracts(setAccessToken), attached to requests by the fetch middleware. - Never stored in
localStorage,sessionStorage, or a readable cookie. - Dies with the page; a reload restores the session via silent refresh, never from storage.
- httpOnly cookie named
refresh_token, owned by the auth service and set through the gateway (SameSite=Lax;SecurewhenCOOKIE_SECURE=true). - JavaScript cannot read it — XSS cannot exfiltrate it.
- Rotation on every use; replay of an old refresh token kills the whole session family server-side.
POST /api/v1/auth/login→ access token in response body, refresh cookie set.- Every API call:
Authorization: Bearer <memory token>. - On
401: one silentPOST /api/v1/auth/refresh(cookie rides along) → new memory token → retry the original call once. Failure ⇒ signed out. - On boot: the same silent refresh decides whether a session exists.
POST /api/v1/auth/logoutrevokes the session family and clears the cookie.
The UI reads claims (sub, email, perms[], ver) from the access token
purely as display hints (RequirePermission). The gateway's fail-closed
registry is the real enforcement point.