Question and scenario
An interviewer gives you the IETF OAuth Working Group draft “OAuth 2.0 Attestation-Based Client Authentication” and asks how a client instance carries a key-bound attestation, then compares it with client_secret and mTLS. The question tests protocol maturity, device identity, and deployment judgment.
What the interviewer is testing
- Separating an OAuth client, client instance, attestation issuer, and Authorization Server.
- Explaining key binding, audience, lifetime, and replay defenses without calling a draft a finalized standard.
- Comparing shared secrets, mTLS, and attestations by trust roots, operations, and failure modes.
Clarifying questions before answering
Clarify the draft version, whether the client is a mobile app, hardware device, or server, who issues attestations, and which verification roots the Authorization Server trusts. Clarify the threat model: copied keys, modified clients, token transfer, or ordinary confidential-client authentication.
30-second answer framework
I would state that this is an IETF OAuth Internet-Draft and that fields depend on the target version. The core idea is for a client instance to submit an attestation bound to its key; the Authorization Server verifies the chain, audience, lifetime, and proof of key possession before accepting OAuth authentication. It expresses instance-level trust better than a shared client_secret, but adds issuer, rotation, revocation, and privacy operations. mTLS has a different trust path and fits environments with an existing PKI.
Step-by-step deep answer
- Separate the logical client registration from a client instance. The instance generates or holds a key, and the attestation states how that key relates to instance properties.
- The client sends the attestation and key-binding material with the OAuth authentication request. The server verifies signatures, the chain, audience, time window, nonce or other replay constraints, and proof that the request was made with the private key.
- After verification, the Authorization Server combines instance state, client ID, policy, and risk signals before normal OAuth authorization or token issuance. An attestation is not authorization.
- Distinguish expired attestations, untrusted issuers, key mismatch, nonce reuse, and revocation with errors that reveal no sensitive details.
- Operate trust roots, issuer rotation, revocation lists, device replacement, and offline verification caches. Record versions and reasons so denials remain explainable.
- Collect only instance properties required by policy. Avoid exposing stable device identifiers to unnecessary resource servers, and keep attestation verification separate from resource authorization.
client_id = mobile-app
client_instance_key = K_instance
attestation = Sign_issuer(K_instance, audience=as.example, exp=t+300)
request_proof = Sign_K_instance(attestation, nonce, oauth_request_hash)High-quality sample answer
I would state the draft status and version first, then separate the logical client from an instance. The instance holds a key and submits a trusted issuer’s attestation bound to that key. The Authorization Server verifies the signature chain, audience, lifetime, nonce, and private-key possession, then uses the result as an authentication input. The attestation does not grant scopes. Compared with client_secret, it reduces shared-secret copying; compared with mTLS, it can fit application instances but requires issuer, rotation, revocation, and privacy operations. Before rollout I would document roots, errors, replay caches, replacement flows, and draft-version compatibility instead of hard-coding an experimental field as a permanent protocol.
Common errors
- Calling an Internet-Draft a published RFC or interoperable standard.
- Assuming an attestation automatically grants authorization or a higher scope.
- Verifying only the issuer signature, not request key possession, audience, or nonce.
- Ignoring revocation, device replacement, clock skew, and offline caches.
- Tracking users with stable device identifiers without minimization or tenant boundaries.
Follow-up questions and responses
What is the key difference from client_secret?
client_secret is usually a copyable shared credential and cannot identify a specific instance. An attestation binds an instance key to an issuer statement, improving instance-level judgment at the cost of trust-root and lifecycle management.
What is the key difference from mTLS?
mTLS uses mutual TLS and certificate PKI to prove a client at the connection layer. Attestation is an OAuth authentication input that can work across transport paths, with different issuer, verification, and privacy models.
How do you prevent attestation replay?
Bind the request hash, audience, short lifetime, and server nonce, cache used nonces or attestation identifiers, and verify possession of the bound private key.
How do you roll out a changing draft?
Make draft version, algorithms, and verifier explicit configuration. Canary in a compatibility environment, retain traditional authentication fallback and metrics, then tighten requirements gradually; never freeze unfinished fields as a permanent protocol.