← Blog
WEB·2 TEMMUZ 2026JUL 2, 2026·7 DK OKUMA7 MIN READ

Passkey'ler üretimde: şifresiz girişin gerçek durumuPasskeys in production: the real state of passwordless login

Passkey'ler artık deney değil: büyük platformlar destekliyor, browser API'leri oturdu, kullanıcılar biyometrik onaya alıştı. Ama "şifreleri kaldırdık" demekle üretimde çalışan bir giriş sistemi arasında mesafe var. Bu yazı passkey'in kaputun altında ne olduğunu, kayıt ve giriş akışlarının nasıl kurulduğunu ve gerçekten zor kısımları — kurtarma, cihazlar arası giriş, geçiş stratejisi — anlatıyor.

Passkeys are no longer an experiment: the major platforms support them, browser APIs have settled, and users are used to biometric prompts. But there's a distance between "we removed passwords" and a login system that works in production. This post covers what a passkey is under the hood, how the registration and sign-in flows are built, and the genuinely hard parts — recovery, cross-device sign-in, rollout strategy.

Naylalabs · MühendislikEngineering

01Passkey nedir, neden phishing'e dirençliWhat a passkey is, and why it resists phishing

Passkey, FIDO2/WebAuthn standardının kullanıcıya dokunan yüzü: her site için ayrı üretilen bir public/private anahtar çifti. Private anahtar cihazdan çıkmaz — ya cihazın güvenli donanımında yaşar ya da platform hesabı üzerinden (iCloud Keychain, Google Password Manager) uçtan uca şifreli senkronize edilir. Sunucuda duran tek şey public anahtardır: sızdırılacak şifre yok, başka sitede denenecek credential listesi yok.

A passkey is the user-facing face of the FIDO2/WebAuthn standard: a public/private keypair generated per site. The private key never leaves the device — it either lives in the device's secure hardware or syncs end-to-end encrypted through a platform account (iCloud Keychain, Google Password Manager). The only thing on your server is the public key: no password to leak, no credential list to try on other sites.

Asıl mühendislik zarafeti origin binding'de: passkey, üretildiği alan adına kriptografik olarak bağlıdır. Kullanıcı piksel piksel kopyalanmış bir phishing sitesine giderse browser o origin için passkey bulamaz; kullanıcı kandırılmaya razı olsa bile imza üretilemez. Phishing direnci eğitimle değil, protokolle gelir.

The real engineering elegance is origin binding: a passkey is cryptographically tied to the domain it was created for. If the user lands on a pixel-perfect phishing clone, the browser finds no passkey for that origin; even a willing victim can't produce a signature. Phishing resistance comes from the protocol, not from training.

UX tarafında da denklem ilk kez şifre aleyhine döndü: yazmak yerine Face ID veya parmak izi. Hatırlanacak, tekrar kullanılacak, çalınıp doldurulacak bir sır yok — credential stuffing'in hedef alacağı şey ortadan kalkıyor. Şifre yöneticisi kurduramadığınız kullanıcı, biyometrik onayı zaten her gün telefon kilidinde kullanıyor.

On the UX side, the equation finally turned against passwords: Face ID or a fingerprint instead of typing. Nothing to remember, nothing to reuse, nothing to steal and stuff — the very target of credential stuffing disappears. The user you could never convince to install a password manager already uses biometrics every day to unlock their phone.

Passkey daha iyi bir şifre değildir; şifrenin yokluğudur.
A passkey isn't a better password. It's the absence of one.

02Uygulamanın şekli: iki ceremonyThe shape of the implementation: two ceremonies

WebAuthn iki "ceremony" tanımlar: kayıt ve giriş. İkisinde de desen aynıdır — sunucu tek kullanımlık bir challenge üretir, browser bunu authenticator'a iletir, dönen cevabı sunucu doğrular. Challenge'ın tek kullanımlık olması replay saldırısını, origin kontrolü ise sahte siteden gelen imzayı keser.

WebAuthn defines two ceremonies: registration and authentication. The pattern is the same in both — the server issues a one-time challenge, the browser hands it to the authenticator, and the server verifies what comes back.

webauthn-akis.txt — özet / sketch
# kayıt / registration ceremony
server → client : challenge + rp.id + user.id
client          : navigator.credentials.create()  # biyometrik onay / biometric prompt
device          : keypair üretir / generates keypair
client → server : credentialId + publicKey
server          : doğrula & sakla / verify & store

# giriş / authentication ceremony
server → client : challenge
client          : navigator.credentials.get()
device          : challenge'ı imzalar / signs the challenge
server          : imza + origin + rp.id doğrula / verify signature, origin, rp.id

Sunucu tarafında saklanacaklar mütevazı: kullanıcı başına bir veya daha fazla credential ID, public key ve sign counter. Doğrulama mantığını elle yazmayın — her büyük dilde bakımlı bir WebAuthn kütüphanesi var ve challenge, origin ve imza kontrolünün her satırı bir güvenlik sınırıdır. Bir kullanıcının birden fazla passkey'i olabileceğini (telefon, laptop, donanım anahtarı) veri modeline baştan koyun; passkey'leri sonradan tekile indirgemek acı verir.

What you store server-side is modest: one or more credential IDs per user, the public key and a sign counter. Don't hand-roll the verification logic — every major language has a maintained WebAuthn library, and every line of challenge, origin and signature checking is a security boundary. Model multiple passkeys per user (phone, laptop, hardware key) from day one; retrofitting a single-credential schema hurts.

03Gerçekten zor kısımlarThe genuinely hard parts

Protokol olgun, kütüphaneler oturmuş durumda. Asıl zorluk protokolün kendisinde değil, etrafını saran insan senaryolarında — ve fizibilite görüşmelerinde en çok atlanan kısım da burası:

The protocol is mature. The difficulty isn't in the protocol; it's in the human scenarios around it:

04Geçiş: passkey-first, passkey-only değilRollout: passkey-first, not passkey-only

Doğru sıralama passkey-first: girişte önce passkey'i öner, şifreyle giren kullanıcıya oturumun hemen ardından passkey oluşturmayı teklif et — ama şifreyi silme. Şifreyi kaldırmak bir lansman değil, bir metrik eşiğidir: passkey ile açılan oturum oranını ölçün, kurtarma akışının gerçek kullanıcılar tarafından gerçekten tamamlandığını görün, ondan sonra konuşun.

The right order is passkey-first: offer the passkey at sign-in, and offer to create one right after a password login — but don't delete the password. Removing passwords is not a launch, it's a metric threshold: measure the share of sessions opened with a passkey, watch real users actually complete the recovery flow, then have the conversation.

İki yaygın tuzak. Birincisi, passkey'i yalnızca 2FA'nın ikinci adımı gibi konumlamak: kullanıcıya iki tören yaşatırsınız ve asıl kazancı — tek adımda phishing dirençli giriş — çöpe atarsınız. İkincisi, feature detection yapmadan akışı passkey'e zorlamak: desteklemeyen browser'da giriş kırılır. PublicKeyCredential kontrolü birkaç satırdır; atlamayın, desteklemeyen tarafı sessizce şifre akışına düşürün.

Two common pitfalls. First, positioning passkeys only as the second step of 2FA: you put users through two ceremonies and throw away the actual win — phishing-resistant login in a single step. Second, forcing the flow onto passkeys without feature detection: login breaks on unsupported browsers. The PublicKeyCredential check is a few lines; don't skip it, and quietly fall back to the password flow where support is missing.

Kısa liste. Üretime çıkmadan: passkey-first, şifre fallback ✓ · passkey'den bağımsız kurtarma yolu ✓ · hesap başına çoklu credential ✓ · feature detection ✓ · adoption metriği ✓. Şifreyi silmek ilk adım değil, son adımdır.Before go-live: passkey-first with a password fallback ✓ · a recovery path independent of passkeys ✓ · multiple credentials per account ✓ · feature detection ✓ · adoption metrics ✓. Deleting the password is the last step, not the first.
PasskeysWebAuthnAuthenticationPasswordless