Zenn
🔑

Apple Platform における passkeys の進化 (2024年版)

2024/12/16に公開

はじめに

本記事は ANDPAD Advent Calendar 2024 の 15 日目の記事です。

この記事では、 passkeys という認証方式についての紹介や、 WWDC 2024 における発表内容を元に、2023 年から 2024 年の間にどのような進化を遂げたのかについて紹介します。

passkeys に興味のある方、かつ iOS といった Apple platfrom を利用している、または Apple platform 向けに開発している方を対象にしています。

この記事は、 WWDC 2024 の Streamline sign-in with passkey upgrades and credential managers (パスキーによるアップグレードと認証情報マネージャによるサインインの効率化) という動画と、筆者が昨年の iOSDC Japan 2023 で発表した 認証体験向上のためにpasskeys(パスキー)に対応する という発表がベースになっています。興味ある方はぜひご覧になってください。

https://developer.apple.com/jp/videos/play/wwdc2024/10125/

https://fortee.jp/iosdc-japan-2023/proposal/b603f798-e7f5-487d-a8f0-7d48d952fad1

passkeys とは

passkeys (パスキー) は次世代の認証技術のことです。生体認証等のスマホ・ PC が持つ技術を組み合わせることでパスワード無しの認証を実現しました。

下図は、私が発表の中で使用した、 passkeys に関するデモの動画から抜粋したサインアップ・サインイン時のスクリーンショットです。

サインアップ サインイン
サインアップ サインイン

上記は Apple が配布している passkeys のサンプルアプリを修正して動かしています。サインアップで passkey 関連情報を保存し、サインインでは保存した passkey 情報を選択するだけで、パスワードの入力無しで認証を行うことができます。

実際どのようなユーザー体験になるのかについては、 FIDO という passkeys の実現に必要な技術の策定を主導した団体が作ったデモ動画がイメージしやすくおすすめです。

https://www.youtube.com/watch?v=it44MGvIiDs

passkeys が登場した背景として、パスワード認証における下記のような課題を改善する目的があります。

  • セキュリティ面での課題
  • ユーザビリティ面での課題

セキュリティ面での課題

セキュリティ面の課題については、特にフィッシング攻撃に対する脆弱性が挙げられます。フィッシング攻撃は、実在する組織を騙って偽サイトへ誘導し、アカウント情報を不正取得する攻撃手法のことです。フィッシングはここ数年増加傾向にあり、またメールの文面や偽サイトも年々巧妙化してきているため、簡単に見分けがつかないようなものが出てきている状態です[1]

ユーザビリティ面での課題

次にユーザビリティ面の課題についてですが、やはりパスワード管理の手間が挙げられるのではないでしょうか。文字数・文字種の制約も年々複雑化しており、パスワードを1つ作るだけでも容易ではありません。また、サービス毎にパスワードを分けることまで考えると、最早記憶しておくこと自体、現実的ではありません。

さらに、サインイン後も度々パスワードの入力を求められますし、最近は二要素認証といった他の認証情報と組み合わせることが一般的になってきたので、認証にかかる時間も短くはありません。

パスワードマネージャを使えば良い、という話もありますが、一般に普及しているとは言い切れない状況[2]で、パスワード使い回しや推測しやすいフレーズで登録する、といった運用を行なっている(=セキュリティ的に脆弱な運用を行なっている)ケースがまだまだ多いのではないでしょうか。

passkeys に対応することのメリット

ここからは前述の課題を踏まえた上で、 passkeys に対応することのメリットについて紹介します。

パスワードを利用せずに認証ができる ということは、前節で挙げたような課題に対する有効なソリューションとなり得ます。

まず、 passkeys はパスワードを登録する必要が無く、フィッシング攻撃のターゲットになるような情報がそもそも使われません。

また、パスワードを使わないことにより、パスワード管理の手間を省くことができるため、強度の低いパスワードやパスワード使い回しといったリスクを考える必要もありません。

さらに、二要素認証といった他の認証との組み合わせも不要なので、認証にかかる時間も削減できますし、二要素認証のために他のアプリを立ち上げるといった手間もなくなります。

passkeys はユーザーにとっての使い勝手を向上させながらセキュリティリスクも減らすことができるため、 passkeys の導入はユーザーにとって大きなメリットがあると言えます。

passkeys の注目度が増し、対応サービスも増加

昨年私が発表した時に比べ、 passkeys の注目度が着実に高まっています。

この記事を執筆している際に気づきましたが、日本経済新聞 [3] や NHK [4] でも取り上げられたようです。

また、メルカリやドコモなど、日本の企業においても対応が進んできました。筆者の体感としても、 passkeys 認証を見かける機会は着実に増えているように感じます。

WWDC 2024 で紹介された passkeys の新機能

ここからは、今年の 6 月に開催された WWDC 2024 で行われた「パスキーによるアップグレードと認証情報マネージャによるサインインの効率化」という動画の中で紹介された、 passkeys 関連の新機能について紹介します。

Automatic passkey updates (パスキーへの自動アップグレード)

passkeys が完全に普及しているとは現時点では言えず、また passkeys に対応していたとしてもすでにパスワード認証でユーザー登録していた場合は passkeys へ移行するのは重い腰が上がらないことも多いのではないでしょうか。

パスワード認証を使っているユーザーが passkeys 認証への移行を促すための仕組みが Automatic passkey updates です。

全体の処理の流れについては、次のとおりです。

  1. アプリでパスワードを使ったサインインが行われる
  2. アプリからシステム[5]へ passkey へのアップグレードリクエストが行われる
  3. システム内部でチェックを行った上で条件を満たしていれば新しい passkey を返し、条件を満たしていなかった場合はエラーを返す

なお、3.でエラーが返ってきた場合についても、そのままパスワード認証を使い続ければ良いだけなので、ユーザーには特に影響は発生しません。

上記手順が前述の動画内でシーケンス図を使って解説されており、よくまとまっていたので、引用して紹介します。興味がる方は動画もぜひご覧ください。

「パスキーによるアップグレードと認証情報マネージャによるサインインの効率化」より抜粋
「パスキーによるアップグレードと認証情報マネージャによるサインインの効率化」より抜粋

また、マネーフォワードさんのサービスで実際に Automatic passkey updates の対応を行った際のことをまとめた記事があり、大変参考になるのでこちらもぜひご覧ください。

https://moneyforward-dev.jp/entry/2024/10/16/160000

動画の中では、サインイン処理のサンプル実装を使い Automatic passkey updates へ対応する方法が解説されていました。

下記は Automatic passkey updates 対応前のコードを動画から引用したものです。

func signIn() async throws {
    let userInfo = try await signInWithPassword()
    guard !userInfo.hasPasskey else { return }
    let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
        relyingPartyIdentifier: "example.com")

    guard try offerPasskeyUpsell() else { return }
    let request = provider.createCredentialRegistrationRequest(
        challenge: try await fetchChallenge(),
        name: userInfo.user,
        userID: userInfo.accountID)

    do {
        let passkey = try await authorizationController.performRequest(request)
        // Save new passkey to the backend
    } catch {}
}

コードの詳しい解説はここでは行いません[6]が、passkeys を取得するためには ASAuthorizationRequest を取得する必要があります。また、 ASAuthorizationRequest を取得するためには ASAuthorizationPlatformPublicKeyCredentialProvider.createCredentialRegistrationRequest() メソッドを呼び出す必要があります。

また、 offerPasskeyUpsell() メソッドは passkeys への移行を促すためのダイアログを表示する擬似コードです。

次に、 Automatic passkey updates 対応後のコードです (動画から引用)。

func signIn() async throws {
    let userInfo = try await signInWithPassword()
    guard !userInfo.hasPasskey else { return }
    let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
        relyingPartyIdentifier: "example.com")

    let request = provider.createCredentialRegistrationRequest(
        challenge: try await fetchChallenge(),
        name: userInfo.user,
        userID: userInfo.accountID,
        requestStyle: .conditional)

    do {
        let passkey = try await authorizationController.performRequest(request)
        // Save new passkey to the backend
    } catch {}
}

差分が 2 箇所あることがわかります。

一つ目は、offerPasskeyUpsell() メソッドが消えています。これは、自動で passkeys に移行されるため、不要になったことを意味しています。

二つ目は、 ASAuthorizationPlatformPublicKeyCredentialProvider.createCredentialRegistrationRequest() メソッド の引数に requestStyle という引数が追加されています。 requestStyle.conditional を指定すると、ダイアログ表示無しに passkeys に移行し、 .standard を指定すると、これまで通りダイアログ表示されます[7]

Improvements for credential managers (認証情報マネージャで利用可能な新機能)

認証情報マネージャ とは、1Password や iOS 18 で標準搭載された、 Apple 純正のパスワードアプリといった パスワードマネージャ を指しています。

上記のような認証情報マネージャでも、iOS 18 以降であれば Automatic passkey updates による passkeys への自動アップデートが利用できるようになりました。

さらに、動画の中では、二要素認証で使用するワンタイムパスワードについても AutoFill できるようになったと紹介されています。

iOS 18 以降にはなりますが、対応するパスワードマネージャを利用していれば、シームレスにワンタイムパスワードの入力が完了できてしまうというのは、大きなメリットと言えるのではないでしょうか。

Passwords app (パスワードアプリ)

前節でも言及しましたが、 iOS 18 から Apple 純正のパスワードアプリが標準搭載されました。

iOS 17 までは設定アプリ内で passkey 情報を管理していましたが、iOS 18 からパスワードアプリに一元化されました。

iOS 17 iOS 18
iOS 17 iOS 18

また、パスワードアプリ上での表示内容を制御する方法についても解説されていました。

タイトルについては、 Web サイト上で下記のような meta タグを仕込んでおけば良いようです。

<meta name="og:sitename" content="パスワードアプリ上で表示される名称">

まとめ

今回は、 passkeys の概要や passkeys に関する新機能について紹介しました。

認証プロセスは個人情報を保護する上で非常に重要なプロセスである一方、従来のパスワードに関するセキュリティ上の問題や入力や管理の手間など、多くの問題を抱えていました。改めて、 passkeys はユーザビリティとセキュリティを両立できる多くの可能性を秘めた技術だと再認識しました。

また、 WWDC の動画からは、 Apple は本気で passkeys を普及させようという強い意志を感じました。対応サービスも増えてきたので、来年は passkeys がより多くのユーザーへ普及してくれると良いなと改めて思いました。

脚注
  1. フィッシング対策協議会が事例について詳しくまとめて公開しています。実際どのような攻撃が行われているのかが詳細にまとめられています。https://www.antiphishing.jp/news/database/ ↩︎

  2. Bitwarden 社が 2022 年に行った調査によると、パスワードマネージャを利用する人の割合は全世界で 34% 、日本で 20% 程度とのことです。 https://www.zunda.co.jp/blog/keeper-in-japan ↩︎

  3. https://www.nikkei.com/article/DGXZQOUC066N60W4A201C2000000/ ↩︎

  4. https://www3.nhk.or.jp/news/html/20241212/k10014666151000.html ↩︎

  5. 動画の中では、OS (iOS/iPadOS/macOS) や認証情報マネージャのことを指して システムと 呼んでいるようです。 ↩︎

  6. 詳細な処理手順については、筆者が iOSDC Japan 2023 で発表した際の資料または動画をご覧ください。 https://fortee.jp/iosdc-japan-2023/proposal/b603f798-e7f5-487d-a8f0-7d48d952fad1 ↩︎

  7. Apple Developer にドキュメントはありますが、詳しい説明は現時点で一切書かれていないようです。 ↩︎

Discussion

ログインするとコメントできます