spomky-labs/dbsc-bundle
Symfony bundle for implementing Device Bound Session Credentials (DBSC), binding sessions to device-held keys to reduce cookie theft and session hijacking. Provides configuration, endpoints, and integration with Symfony security for stronger, phishing-resistant session protection.
What this actually is: Spomky-Labs/dbsc-bundle is a Symfony bundle implementing the W3C Device Bound Session Credentials (DBSC) draft — not a Laravel package. It hooks into Symfony Security firewalls, emits Secure-Session-Registration, verifies TPM-backed JWS proofs, manages the bound cookie lifecycle, and ships a WebProfiler panel. That framing mismatch is the single most important thing to resolve before any estimate.
Secure-Session-* headers unmodified, and a shared store across nodes.jwk protected header preferred over legacy key claim; new aud binding to the endpoint URL; a § 9.10 authorization round-trip). Semver gives no compatibility guarantee below 1.0, and the "Changed" section alters both verification semantics and HTTP status behavior.200 with continue: false and a cleared cookie instead of 401. Any client, monitor, alert, or dashboard keyed on 401 from the refresh endpoint will misread this. Unknown sessions still 401 by design (non-enumeration) — keep those two paths distinguishable in telemetry.aud claim is now validated when present (missing is tolerated). Proofs minted for a different endpoint will be rejected — correct, but it can surface as a sudden registration failure after a hostname/alias or proxy change.dbsc_session.Secure-Session-Registration and Secure-Session-Response end to end?authorization value (if we use it) and what backend invariant does it attest to?0.3.0) in Composer; do not use a caret constraint on a pre-1.0 package with draft-spec dependencies. Plan to re-review at every minor. Do not plan a 1.0 migration from this release until the underlying spec stabilizes.dev only) is excluded from production bundles, and that our CSP/header-injection middleware does not strip the Secure-Session-* family.include_site: true (only if the estate genuinely spans subdomains), and populate allowed_refresh_initiators only if a cross-origin app truly initiates refresh — an empty list is the safe default.authorization value (if used) into the registration handler and assert echo-back equality server-side.Secure-Session-Skipped notice-level logging into the central pipeline.401s that look like client bugs. Refresh traffic scales with session_lifetime, not request volume, so keep lifetimes sane to avoid re-registration storms.allowed_refresh_initiators → refresh never initiates; silent downgrade to an ordinary cookie with no error.Secure-Session-* → total no-op, no client-side error.200 continue: false on expiry — confirm client and dashboards handle it; keep it distinct from the 401 unknown-session signal.session_lifetime → frequent re-registration, elevated auth latency.fetch() calls) is the strongest operational asset in this release — it converts a blind debugging exercise into an observable one and should materially cut time-to-first-working-integration. Staff one backend engineer plus one platform/edge engineer. Rough guide: 1–2 weeks to a staging round-trip on Symfony; materially longer if we are reimplementing on Laravel.How can I help you explore Laravel packages today?