kullanıcıDoğrulama ile ilgili ayrıntılı inceleme

Bu dokümanda, WebAuthn'da userVerification öğesinin ne olduğu ve geçiş anahtarı oluşturma veya kimlik doğrulama sırasında userVerification belirtildiğinde ortaya çıkan tarayıcı davranışları açıklanmaktadır.

WebAuthn'daki "kullanıcı doğrulaması" nedir?

Geçiş anahtarları, ortak anahtar kriptografisine dayalı olarak oluşturulur. Geçiş anahtarı oluşturduğunuzda herkese açık-özel anahtar çifti oluşturulur, özel anahtar geçiş anahtarı sağlayıcısı tarafından depolanır ve ortak anahtar, depolanmak üzere bağlı tarafın (RP) sunucusuna döndürülür. Sunucu, eşlenmiş ortak anahtarı kullanarak aynı geçiş anahtarı tarafından imzalanan bir imzayı doğrulayarak kullanıcının kimliğini doğrulayabilir. Ortak anahtar kimlik bilgilerindeki "kullanıcı mevcut" (UP) işareti, kimlik doğrulama sırasında birisinin cihazla etkileşime geçtiğini kanıtlar.

Kullanıcı doğrulaması, kimlik doğrulama sırasında yalnızca bir kişinin değil, doğru kişinin de bulunduğunu onaylamayı amaçlayan isteğe bağlı bir güvenlik katmanıdır. Akıllı telefonlarda bu işlem genellikle ekran kilidi mekanizması (ör. biyometri, PIN veya şifre) kullanılarak yapılır. Kullanıcı doğrulamasının yapılıp yapılmadığı, geçiş anahtarı kaydı ve kimlik doğrulama sırasında kimlik doğrulayıcı verilerinde döndürülen "UV" işaretinde bildirilir.

macOS'teki iCloud Anahtar Zinciri'nde kullanıcı doğrulama iletişim kutusunun ekran görüntüsü. İletişim kutusu kullanıcıdan Touch ID'yi kullanarak oturum açmasını ister. Burada, kimlik doğrulama isteğinde bulunan kaynak ve kullanıcı adı görüntülenir. İletişim kutusunun sağ üst kısmında "İptal" etiketli bir düğme bulunur.
macOS'teki iCloud Anahtar Zinciri'nde kullanıcı doğrulama iletişim kutusu.
Android için Chrome'daki kullanıcı doğrulama iletişim kutusunun ekran görüntüsü. İletişim kutusunda yüz tanıma veya parmak izi algılamayı kullanarak kullanıcıdan kimliğini doğrulamasını ister ve kimlik doğrulama isteğinde bulunan kaynağı gösterir. Sol altta PIN kullanarak doğrulama seçeneği bulunur.
Android Chrome'da kullanıcı doğrulama iletişim kutusu.

UP ve UV'nin sunucuda nasıl doğrulandığı

Kullanıcı varlığı (UP) ve kullanıcı tarafından doğrulanmış (UV) Boole işaretleri, kimlik doğrulayıcı veri alanında sunucuya gönderilir. Kimlik doğrulama sırasında, kimlik doğrulayıcı veri alanının içeriği, depolanan ortak anahtar kullanılarak imza doğrulanarak doğrulanabilir. İmza geçerli olduğu sürece sunucu işaretlerin orijinal olduğunu düşünebilir.

Kimlik doğrulama veri yapısının gösterimi. Veri yapısının soldan sağa her bölümünde "RP ID HASH" (32 bayt), "FLAGS" (1 bayt), "COUNTER" (4 bayt, big-endian uint32), "ATTESTE CRED" yazar. DATA' (varsa değişken uzunluk) ve "EXTENSIONS" (varsa değişken uzunluk (CBOR)). "BİLGİLER" bölümü, soldan sağa doğru etiketlenmiş olası işaretlerin listesini gösterecek şekilde genişletilir: "ED", "AT", "0", "BS", "BE", "UV", "0" ve "UP".
Ortak anahtar kimlik bilgilerindeki Authenticator veri alanları.

Geçiş anahtarı kaydı ve kimlik doğrulamasında sunucu, yukarı işaretin true olduğunu ve gereksinime bağlı olarak UV işaretinin true veya false olup olmadığını incelemelidir.

userVerification parametresini belirtme

RP, WebAuthn spesifikasyonuna göre hem kimlik bilgisi oluşturma hem de onaylama için userVerification parametresiyle kullanıcı doğrulaması isteyebilir. Sırasıyla 'preferred', 'required' veya 'discouraged' kabul edilir. Yani sırasıyla:

  • 'preferred' (varsayılan): Cihazda bir kullanıcı doğrulama yöntemi kullanmak tercih edilir ancak mevcut değilse atlanabilir. Yanıt kimlik bilgisi, kullanıcı doğrulaması yapılmışsa true ve UV gerçekleştirilmediyse false UV işareti değerini içerir.
  • 'required': Cihazda bulunan bir kullanıcı doğrulama yönteminin çağrılması gerekir. Mevcut değilse istek yerel olarak başarısız olur. Bu, yanıt kimlik bilgilerinin UV işareti true olarak ayarlanmış şekilde her zaman döndürüleceği anlamına gelir.
  • 'discouraged': Kullanıcı doğrulama yöntemi kullanılması önerilmez. Ancak, cihaza bağlı olarak kullanıcı doğrulaması yine de gerçekleştirilebilir ve UV işareti true veya false içerebilir.

Geçiş anahtarı oluşturma için örnek kod:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

Geçiş anahtarı kimlik doğrulaması için örnek kod:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

userVerification için hangi seçeneği tercih etmelisiniz?

Kullanmanız gereken userVerification değeri, uygulama gereksinimlerinize ve kullanıcı deneyimi ihtiyaçlarınıza bağlıdır.

userVerification='preferred' ne zaman kullanılır?

Koruma yerine kullanıcı deneyimine öncelik veriyorsanız userVerification='preferred' kullanın.

Kullanıcı doğrulamasının korumadan çok ihtiyatlı olduğu ortamlar vardır. Örneğin, Touch ID'nin kullanılamadığı macOS'te (cihazın desteklemediği, devre dışı bırakıldığı veya cihaz kapaklı modda olduğu için) kullanıcıdan bunun yerine sistem şifresini girmesi istenir. Bu soruna neden olur ve kullanıcı, kimlik doğrulamasını tamamen terk edebilir. Pürüzleri ortadan kaldırmak sizin için daha önemliyse userVerification='preferred' özelliğini kullanın.

Touch ID kullanılamadığında macOS'te geçiş anahtarı iletişim kutusunun ekran görüntüsü. İletişim kutusunda kimlik doğrulama isteğinde bulunan kaynak ve kullanıcı adı gibi bilgiler bulunur. İletişim kutusunun sağ üst kısmında "İptal" etiketli bir düğme bulunur.
Touch ID kullanılamadığında macOS'te geçiş anahtarı iletişim kutusu gösteriliyor.

userVerification='preferred' kullanıldığında, kullanıcı doğrulaması başarıyla gerçekleştirilmişse UV işareti true, kullanıcı doğrulaması atlanırsa false olur. Örneğin, Touch ID'nin kullanılamadığı macOS'te, kullanıcıdan kullanıcı doğrulamasını atlamak için bir düğmeyi tıklaması istenir ve ortak anahtar kimlik bilgisi bir false UV işareti içerir.

UV işareti bu şekilde risk analizinizde bir sinyal olabilir. Oturum açma girişimi diğer faktörler nedeniyle riskli görünüyorsa, kullanıcı doğrulaması gerçekleştirilmemişse kullanıcıya ek oturum açma sorgulamaları sunmak isteyebilirsiniz.

userVerification='required' ne zaman kullanılır?

Hem üst hem de UV'nin kesinlikle gerekli olduğunu düşünüyorsanız userVerification='required' kullanın.

Bu seçeneğin olumsuz bir yönü, kullanıcının oturum açarken daha fazla zorluk yaşamasıdır. Örneğin, Touch ID'nin kullanılamadığı macOS'te, kullanıcıdan sistem şifresini girmesi istenir.

userVerification='required' sayesinde, kullanıcı doğrulamasının cihazda gerçekleştirildiğinden emin olabilirsiniz. Sunucunun UV işaretinin true olduğunu doğruladığından emin olun.

Sonuç

Geçiş anahtarı kullanan taraflar, kullanıcı doğrulamasını kullanarak cihaz sahibinin oturum açma olasılığını ölçebilir. Yedek oturum açma mekanizmasının kullanıcı akışını ne kadar kritik etkilediğine bağlı olarak kullanıcı doğrulamasını zorunlu kılmayı veya isteğe bağlı yapmayı tercih eder. Sunucunun, geçiş anahtarı kullanıcı kimlik doğrulaması için YUKARI işaretini ve UV işaretini kontrol ettiğinden emin olun.