example.com works for https://example.com and https://app.example.com.app.example.com is narrower and only works for that exact subdomain.evil.com cannot claim example.com; the browser rejects the request.rp: { id: "example.com", name: "Example App" } // later rpId: "example.com"
1. Browser validation
evil.com and pretend to be google.com.2. Signed origin data
clientDataJSON.https://example.com.3. Fresh challenge