Slide 1

Slide 1 text

パスキーでのログインを 実装してみよう! HIBIKI CUBE @ PHPerKaigi 2025

Slide 2

Slide 2 text

ぜひいっぱいツイートしてください! #phperkaigi #b

Slide 3

Slide 3 text

󰎩󰑔󰏮 自己紹介 ヒビキ @hibiki_cube

Slide 4

Slide 4 text

PHPerKaigi、ただいま〜〜〜〜!!

Slide 5

Slide 5 text

パスキーでのログインを 実装してみよう! HIBIKI CUBE @ PHPerKaigi 2025

Slide 6

Slide 6 text

パスキーでのログインを 実装してみよう! HIBIKI CUBE @ PHPerKaigi 2025

Slide 7

Slide 7 text

何らかのログインを 実装したことがある という方!

Slide 8

Slide 8 text

パスキーでのログインを 実装したことがある という方!

Slide 9

Slide 9 text

実は今回………

Slide 10

Slide 10 text

実は今回……… この発表のために デモ環境を ご用意しています!

Slide 11

Slide 11 text

とりあえず触ってみましょう phperkaigi-2025-try-passkey.hibiki-cube.dev

Slide 12

Slide 12 text

とりあえず触ってみましょう

Slide 13

Slide 13 text

いま使って分かったパスキーの特徴2つ ● Touch IDやFace IDなどの生体認証により本人確認 ● ユーザーは何も入力せずにログインできる

Slide 14

Slide 14 text

いま使って分かったパスキーの特徴2つ ● Touch IDやFace IDなどの生体認証により本人確認 ● ユーザーは何も入力せずにログインできる → ユーザーは何も覚える必要がない

Slide 15

Slide 15 text

いま使って分かったパスキーの特徴2つ ● Touch IDやFace IDなどの生体認証により本人確認 ● ユーザーは何も入力せずにログインできる → ユーザーは何も覚える必要がない → 人間起因のセキュリティリスクを極力減らせる

Slide 16

Slide 16 text

パスキーの特徴 ● 生体認証とセットで動作 ● ログイン時に入力するものは何もなし ● サイトとパスキーが紐づく仕組み ● 公開鍵暗号の仕組みを使った認証 ● 機密性のある情報は暗号化されて守られる Passkeys

Slide 17

Slide 17 text

パスキーの特徴 ● 生体認証とセットで動作 ● ログイン時に入力するものは何もなし ● サイトとパスキーが紐づく仕組み ● 公開鍵暗号の仕組みを使った認証 ● 機密性のある情報は暗号化されて守られる Passkeys

Slide 18

Slide 18 text

公開鍵暗号で認証する仕組み

Slide 19

Slide 19 text

公開鍵暗号で認証する仕組み

Slide 20

Slide 20 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵

Slide 21

Slide 21 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 俺の鍵持っといて

Slide 22

Slide 22 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 (なにこの鍵)

Slide 23

Slide 23 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 ログインしたいな

Slide 24

Slide 24 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 ログインしたいな じゃあこの問題を 解いてみな

Slide 25

Slide 25 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 秘密鍵で 署名したよ

Slide 26

Slide 26 text

公開鍵暗号で認証する仕組み 秘密鍵 公開鍵 秘密鍵で 署名したよ 確かに正しい鍵だ 通ってよし!

Slide 27

Slide 27 text

余談: パスキーはSSHに似てる? SSH パスキー ユーザーがキーを生成・転送 登録の仕組み システムがキーを生成・転送 なし ログイン時にすること 認証操作 公開鍵と秘密鍵の一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり

Slide 28

Slide 28 text

従来のパスワード認証とパスキーを比較

Slide 29

Slide 29 text

従来のパスワード認証とパスキーを比較 パスワード パスキー IDとパスワードの作成 登録時にすること ユーザー名の入力 IDとパスワードの入力 ログイン時にすること 認証操作 IDとパスワードの一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり ⚠ 危険性あり 機密情報の漏洩 ✅ 難しい ⚠ 低い フィッシングへの耐性 ✅ あり

Slide 30

Slide 30 text

パスキー認証に必要なユーザー操作 プロンプトを確認して 生体認証するだけ

Slide 31

Slide 31 text

従来のパスワード認証とパスキーを比較 パスワード パスキー IDとパスワードの作成 登録時にすること ユーザー名の入力 IDとパスワードの入力 ログイン時にすること 認証操作 IDとパスワードの一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり ⚠ 危険性あり 機密情報の漏洩 ✅ 難しい ⚠ 低い フィッシングへの耐性 ✅ あり

Slide 32

Slide 32 text

フィッシングを防ぐ仕組み ● 各パスキーはRP IDでサービスに紐づいている ● パスキーと対応するオリジンでないと使えない ● どんなに見た目を似せたサイトでも、パスキーを使うことは不可能 HIBIKI @ Google google.com 🔒goo9le.com

Slide 33

Slide 33 text

従来のパスワード認証とパスキーを比較 パスキーなら、よりセキュアな認証を実現できる🚀 パスワード パスキー IDとパスワードの作成 登録時にすること ユーザー名の入力 IDとパスワードの入力 ログイン時にすること 認証操作 IDとパスワードの一致 認証の根拠 公開鍵と秘密鍵の一致 ❌ なし 本人確認 ✅ あり ⚠ 危険性あり 機密情報の漏洩 ✅ 難しい ⚠ 低い フィッシングへの耐性 ✅ あり

Slide 34

Slide 34 text

パスキーは運営側も嬉しい パスワード パスキー IDとパスワードを保存 登録時にすること ユーザー名と公開鍵の保存 IDとパスワードの検証 ログイン時にすること チャレンジの検証 パスワードのハッシュ 保持するもの 公開鍵 パスワードのハッシュ 通信経路を流れるもの 署名されたチャレンジ ハッシュを破られると…? 情報漏洩のリスク 公開鍵は漏れても大丈夫 ⚠ 可能 認証情報の使い回し ✅ 不可能

Slide 35

Slide 35 text

実際に実装するには

Slide 36

Slide 36 text

有名どころはパスキー対応済み!

Slide 37

Slide 37 text

もちろんPHP用のサーバーサイドライブラリもあります!

Slide 38

Slide 38 text

必要なもの フロントエンド ● 登録やログインのためのUI ● APIとやり取りする仕組み ● デバイスの認証機とやり取りする仕組み バックエンド ● ユーザーとパスキーを管理するDB ● チャレンジを発行するAPI ● 署名されたチャレンジを検証するAPI ● セッションを管理する仕組み

Slide 39

Slide 39 text

ユーザーとパスキーを管理するDB

Slide 40

Slide 40 text

実装上・運用上の注意

Slide 41

Slide 41 text

パスキーを実装する上で気にすること ● フォームの設計 ● 既存のユーザーID / パスワード認証との共存 ● autocompleteを適切に設定すると嬉しい

Slide 42

Slide 42 text

パスキーを運用する上で気にすること ● パスキーにまだ慣れていないユーザーへの対応 ● パスキーを紛失したときの対応 ○ パスワードで再設定できるようにする? ○ 復旧コードなどを事前に発行しておく? ○ マジックリンクで復旧できるようにする? ● 他の選択肢が多ければ、それだけセキュリティの弱みも増える

Slide 43

Slide 43 text

Passkeyと仲良く!