🥶

世の中で正しく意味が理解されていないまま使われている○○認証の分類

2023/02/24に公開2

ritouです。

最近、というかずーーっと前からなんですが、世の中に○○認証と言われるものがたくさんあります。

ある程度専門性の問われる分野の用語は正しい意味で使われている気がしますが、一般的なWebアプリケーションなどで使われているものは割と意味を理解しないまま使われているものも多いと感じています。

ざっくりこんな分類ができるのかなと思っています。
他にこんなのもあるというのがあったらコメントやTwitterなどで指摘いただければ追記します。

  1. パスワード認証、パスキー認証、生体認証… : 当人認証の方式
  2. 2段階認証、2要素認証、他要素認証 : 当人認証の方式の組み合わせ方
  3. SMS認証、メールアドレス認証 : 当人認証の方式の一部とも言われるが、SMS番号/メールアドレスの所有を確認する処理として以前から使われている
  4. Twitter認証、Google認証、OAuth認証()、OIDC認証、SAML認証 : ID連携を利用した認証
  5. JWT認証、Cookie認証、セッション認証、Basic認証、Digest認証 : 保護されたリソースへのアクセスやセッション管理に関する方式
  6. ログイン認証 : 頭痛が痛い

当人認証の方式

これが一番直感的かなと思います。この前登壇してお話ししたパスキー概要という話で整理したのもこれにあたる○○認証です。

https://zenn.dev/mixi/articles/fdf9236f86ea29

最新の動向を追いたい場合はこちらのイベントに参加するのがおすすめです。

https://openid.connpass.com/event/274482/

組み合わせ方

これも一般的ですね。段階と要素、あたりは

  • 段階 : 1つの認証が通った後に別の認証を要求する時に加算
  • 要素 : いわゆる3要素のどれを使っているかにより加算

というふうに、n要素m段階みたいな整理をするとより厳密な説明となるのでしょう。

前にこんな記事を書きました。参考にどうぞ。

https://zenn.dev/ritou/articles/ea144bcf7e680e

SMS/Email

これもだいぶ一般的ですが、仕事をしていて気をつけないといけないなと思ったのは、あるサービスの「新規登録」や「ログイン」の機能やデザインを考えるときに、「SMS認証」「メールアドレス認証」と言ってしまうと、たまに混乱してしまう人が出てくる というところです。混乱している人としていない人がいる会話ほどカオスなものはありませんね。自分ではこれを避けるためにログイン状態のユーザーが行う処理としては「SMS番号確認」「メールアドレス確認」と言った用語を使ったりします。

ID連携

Twitter/GoogleID連携のIdPの名前を用いた使われ方は

  • Twitterログイン : ログインするだけかな?
  • Twitter連携 : 投稿するだけかな?ログインはできるのかな?

みたいな細かい話はありそうですが認識はしやすいでしょう。

OIDC、SAML、OAuth()みたいなのは前述の文脈よりも少しだけプロトコルの方に注意が向けられた話になっている印象があります。

この辺りから頭の中で少し変換が必要な感じがしてきます。

リソースアクセス、セッション管理

これが若干厄介なところかなと個人的には思います。

これまで紹介してきたものよりも機能として括ってある分、複雑であるとも言えます。

  • "よくあるセッション認証" : Webアプリケーションのセッション管理
    • サーバーは当人認証を完了したユーザーの情報をDBなどに保存したセッション情報のキーをCookieとして発行
    • クライアントはそのCookieがつけて特定のURLにアクセス
    • サーバーはアクセスしてきたユーザーが誰かをセッション情報から識別可能
  • "よくあるJWT認証" : リソースアクセスの方法(JWTなアクセストークンでAPIアクセス)
    • サーバーは当人認証を完了したユーザーの情報を内包したJWT形式のトークンを発行
    • クライアントはそのトークンを用いてAPIアクセス
    • サーバーはJWTの内容を検証してユーザーが誰かを識別可能

細かく見ていくと、これってよく使われているパターンではあるものの、これだけにしないといけない話ではありません。

昔からある巨大サービスはセッション管理の負荷が大きすぎるのでステートレスなCookieによるセッション管理をしていたとか、SPAに対してもレガシーなセッションIDをトークンにして返すとか、逆にSPAにもCookieとしてトークンを発行するとか色々なやり方が考えられるわけです。

なので、この辺の話になったら実現する方法はいくつかあって、そのパターンに名前がついているものがあるよ、それ以外でも使われている組み合わせがあるよというのを意識してもらいたいところです。

https://twitter.com/ritou/status/1628287619603001344

また、Basic認証やDigest認証なんかは当人認証の方式に近いですが、送信時のフォーマットが決められているプロトコル的要素もあり、ブラウザがその情報を保存できるので毎回ステートフルに当人認証を行なってリソースアクセスを実現する方法と説明されます。

まとめ

ここまで紹介してきたように、○○認証と言われていても、この要素を利用する認証方式だというレベルの話から、プロトコルが絡んできたり、IdPの名前が付いてたり、セッション管理やリソースアクセスの方式についての話だったりします。

ある程度の経験があると、この辺りの用語と意味合いの違いを整理できるようになるかと思いますが、
初学者やなんとかエンジニアと繋がりたいみたいな記事の中で全てをフラットにした状態で比較していたりこれだけ覚えておけば良い!みたいな紹介がされるのを見ていると、どうしても勿体無いと感じてしまいます。

この記事は○○認証という言葉を使うな!といって上から拳を振り下ろす意味合いではなく(OAuth認証、お前は別だ)、こんな感じの意味合いで使われているものがあるので混乱しないで整理しておこうなというお話でした。

ではまた。

Discussion

ritouritou

公開鍵認証とか、PKI関連の話もあったか。あっちは厳密な用語が使われがちな気がするからまぁいいか。

ritouritou

Twitterでいただいた反応を忘れないように記載。

https://twitter.com/namaedayo/status/1628951186471809024

確かに○○認証と呼ばれるものは他にもいっぱいありました。
専門性が問われる領域だと乱用みたいなのは少ない気もするので、

ある程度専門性の問われる分野の用語は正しい意味で使われている気がしますが、一般的なWebアプリケーションなどで使われているものは割と意味を理解しないまま使われているものも多いと感じています。

これを追記して、タイトルも修正しました。