Why Passkeys Are Replacing Passwords
Passkeys are phishing-resistant, faster to use, and now supported almost everywhere. Here's how they work and why the password era is finally ending.
A passkey is a WebAuthn credential — a public/private cryptographic key pair created for one specific website. The private key never leaves your device’s secure hardware or your password manager’s encrypted keychain; the site stores only the public key. Signing in means unlocking that private key with a fingerprint, a face scan, or a device PIN, and proving possession by signing a challenge. There is no password anywhere in the flow — nothing to remember, type, reuse, or steal.
That one design decision is the whole story. A password is a shared secret: the same string sits in your head, travels over the network, and lives (hashed, hopefully) in a server database, so it can be phished, replayed, and breached. A passkey shares nothing. Password managers and one-time codes patch the password model; passkeys replace it.
What a passkey actually is
Under the hood, a passkey is a credential defined by WebAuthn, the W3C web standard developed with the FIDO Alliance. When you register, your device generates a fresh key pair scoped to that site and that account. The private key is held by an authenticator — a phone’s secure enclave, a laptop’s TPM, a hardware security key, or a password manager — and is only usable after user verification, meaning your biometric or PIN. Your fingerprint never leaves the device either; it just unlocks the key locally.
The login flow, step by step
- You hit “sign in.” The server generates a random, single-use challenge and sends it to the browser.
- The browser passes the challenge to your authenticator through the WebAuthn API.
- You approve with a touch, a glance, or a PIN. The authenticator signs the challenge — along with the site’s origin and some metadata — using the private key.
- The signature goes back to the server, which verifies it against the public key stored at registration. A valid signature over a fresh challenge proves you hold the private key, and you’re in.
On the web side, the sign-in half looks like this:
const assertion = await navigator.credentials.get({
publicKey: {
challenge: challengeFromServer, // random bytes, used once
rpId: "example.com", // the domain the key is bound to
userVerification: "preferred",
},
});
// send assertion.response to the server for signature verification
Notice what never happens: no secret crosses the network, and the server never holds anything worth stealing.
Why phishing mechanically fails
Passwords are phishable because they’re transferable — a convincing fake page collects the same string the real one would. Passkeys break this at the protocol level. The credential is bound to the site’s origin at creation, and the browser will only offer it to that exact origin. Visit a look-alike domain and the browser finds no matching credential; there’s no password field to fool you with and nothing for the fake site to collect. Because the signed response also encodes the origin, even an attacker proxying your traffic to the real site in real time ends up holding a signature the real site rejects.
The breach story improves just as much. A stolen password database fuels cracking and credential stuffing across every site where people reused that password. A stolen passkey database contains public keys — by definition safe to publish. This is why phishing-resistant authentication is a load-bearing requirement in zero-trust architectures, not a nice-to-have.
Synced or device-bound?
Passkeys come in two flavors.
- Synced passkeys live in a cloud keychain — iCloud Keychain on Apple devices, Google Password Manager on Android and Chrome, or a third-party password manager — and replicate, end-to-end encrypted, across your signed-in devices. Lose your phone and the passkey is still on your laptop. This is the consumer default.
- Device-bound passkeys never leave one piece of hardware, typically a security key. Enterprises and high-security setups prefer them precisely because they can’t be copied — you always know how many exist and where they are.
Crossing ecosystems works too. To sign in on, say, a Windows PC using a passkey stored on an iPhone, the site shows a QR code; you scan it, the two devices confirm they’re physically near each other over Bluetooth, and the phone signs the challenge. The passkey itself never transfers.
Recovery is the honest weak spot
If every device holding your passkey is lost, broken, or wiped — and nothing was synced — that credential is gone. This is why platforms push synced passkeys hard, and why virtually every site keeps fallback sign-in methods: email reset links, SMS codes, or the old password kept on file.
The uncomfortable consequence: your account is only as secure as the weakest recovery path attached to it. An attacker facing an unphishable passkey will simply go after the email reset flow instead. Passkeys move risk from the everyday sign-in, which happens constantly, to rare recovery events, which are easier to monitor — a genuinely good trade, but not the same as eliminating risk. The practical hedge is to register more than one passkey where it matters and keep recovery codes somewhere offline.
Where adoption stands
Platform support is effectively settled. Apple, Google, and Microsoft jointly committed to the FIDO passkey standard back in 2022 and have since shipped support across their operating systems and browsers, and major services — Google, GitHub, and Apple accounts among them — let you sign in with a passkey today. The long tail of smaller sites is still migrating, which is why nearly everyone offers passkeys alongside passwords rather than instead of them. This is a transition, not a flag day.
If you’re building sign-in
Don’t hand-roll WebAuthn verification — the ceremony has real cryptographic edge cases, so use a maintained server-side library or an identity provider. WebAuthn also only runs in a secure context, so HTTPS everywhere is a hard precondition. Offer passkeys as an additional method first and let users upgrade at sign-in rather than forcing a migration. And keep the layers straight: a passkey replaces the password check, not everything after it — a successful ceremony still ends with you minting a session cookie or a JWT as usual, and delegated authorization between services remains OAuth’s job. The pieces compose cleanly.
Passwords vs passkeys
| Passwords | Passkeys | |
|---|---|---|
| What the server stores | Password hash — a breach target | Public key — useless if stolen |
| Phishing | Works on anyone rushed or tired | Mechanically fails off-origin |
| Reuse across sites | Rampant | Impossible — one pair per site |
| Sign-in effort | Type or autofill, often plus a code | One biometric or PIN prompt |
| Recovery | Email reset | Synced keychain, plus site fallbacks |
The takeaway
A passkey is a per-site key pair: the private half stays sealed in your device, the server keeps only the public half, so there’s nothing to phish and nothing valuable to breach. Sign-in is a signed challenge — faster for users and structurally safer than any password-plus-code combination. Recovery and cross-ecosystem movement remain the rough edges, and fallback methods are now the real attack surface. When a site offers a passkey, take it; when you build one, ship it beside your existing auth and let the password quietly retire.
Tagged
Keep reading
Chisato · · 5 min read What Is Session Fixation?
Session fixation tricks a victim into using an attacker-known session ID, so logging in hands the attacker an authenticated session too.
Chisato · · 4 min read What Is IDOR? Insecure Direct Object References Explained
IDOR is an access control flaw where an app trusts a user-supplied ID to fetch a record without checking the requester actually owns it.
Chisato · · 4 min read What Is a Replay Attack?
A replay attack resends a captured, valid message to trick a system into repeating an action — and why timestamps, nonces, and signatures stop it.