はじめに
dipアドベントカレンダー2025 13日目の投稿です。
認証認可を扱うのタスクにがっつり携わることになったので、Auth屋さんの本などを読み初歩の初歩から勉強中です。その中でこれとこれって何が違うの?となることが多発したのでまとめます。
目次
認証と認可
認証 (Authentication)
- 目的:本人確認
- 認証元のユーザーが、ユーザー本人であることを確認すること
認可 (Authorization)
- 目的:権限の付与
- ユーザーに対し、リソース等へのアクセス権限を与えること
あるサービスに登録されているユーザーAがログインしようとした時に、ユーザーAがサービスに登録されていることを確認するのが認証。認証した上で、ユーザーAがそのサービスまたは遷移先の画面にアクセスする権限があれば、アクセスを許可するのが認可。
OAuthとOIDC
OAuth (OAuth 2.0)
- 認可の規格、フレームワーク。
- ユーザーが直接サードパーティアプリにパスワード情報を渡さずに、アクセストークンの発行方法や、それを用いてアクセスして良いかどうか判断するためのルール。
OIDC:OpenID Connect
- OAuth 2.0を拡張した、認証・認可の規格。
- OAuth 2.0の仕組みを拡張し、IDトークンとUserInfoエンドポイントの仕様を追加して、認証にも使えるようにしたもの。
何が違うのか
| 項目 | OAuth 2.0 | OIDC (OpenID Connect) |
|---|---|---|
| 主目的 | 認可 | 認証 |
| 発行されるもの | アクセストークン | アクセストークン + IDトークン |
| 関係性 | ベースとなる仕組み | OAuth 2.0の拡張規格 |
アクセストークンとIDトークン
アクセストークン
- OAuth 2.0で、ユーザーがリソースサーバーにアクセスするための認可を、認可サーバが与えるトークン。
- JWT形式を使うこともあるし、使わないこともある。
- Bearerトークンとして使われることが多い(Authorizationヘッダーに含めてリクエストする)。
IDトークン
- OIDCで、「ユーザーが認証されたこと」を証明するトークン。ユーザーの名前やメールアドレスが含まれる。認証後のリソースサーバーへのアクセスの認可には使用できない。
- 必ずJWT(JSON Web Token)形式。アプリケーション側でJWTをデコードして情報を取得する。
- JWTは
ヘッダ/ペイロード/署名の形式になっており、署名を検証することで改ざんされていないことを確認できる。- この検証に公開鍵認証方式が使われることが多い。
おまけ JWSとJWTとIDトークンの関係
IDトークンは必ずJWTの形式で、その署名方法としてJWSが使われ、ヘッダ/ペイロード/署名という形式になる。IDトークンは署名つきJWTの形式を取る(=JWS)
- JWTはトークンの受け渡し方としてjsonを必須とする。
- IDトークンはJWTを必須とする。
- JWTは署名が必須ではない場合もあるがIDトークンは署名が必須。その署名方法としてJWSを使う。
何が違うのか
| 項目 | アクセストークン | IDトークン |
|---|---|---|
| 目的 | リソースへのアクセス許可を示す | 認証されたことを証明する |
| 形式 | 主にJWT形式、そうでない時もある | 必ずJWT形式 |
(補足)関連用語
トークン取得フローの登場人物たち。
- 認可コード: リソースオーナー(ユーザー)が、クライアント(アプリ)への権限委譲に同意した証として発行される一時的なコード。これを認可サーバーに渡してアクセストークンと交換する。
- リフレッシュトークン: アクセストークンの有効期限が切れた際、再度アクセストークンを要求するために使うトークン。
SSOとSAMLとソーシャルログイン
目的と手段の関係。
SSO:シングルサインオン
- 1度のユーザー認証で、連携する複数のシステムが利用可能になる仕組みのこと。
- これを実現する認証方式が5つある。
- エージェント方式
- リバースプロキシ方式
- 代理認証方式
- フェデレーション方式
- 透過型方式
SAML:Security Assertion Markup Language
- SSOを実現する5つの認証方式の中で、フェデレーション認証(異なるドメイン間で安全に認証情報を連携する方式)で使われる、XMLをベースとした標準規格。
- 用語:
- SP (Service Provider):ユーザーが使いたいサービス
- IdP (Identity Provider):SAML認証の提供元
ソーシャルログイン
- SSOを実現する手段。フェデレーション認証方式。
- LINEやGoogleなどのソーシャルメディアのIDを使って、SSOを実現する(他のサービスへ認証する)手段のこと。
じゃあソーシャルログインにもSAMLを使うってこと???
と思ったのですが全然違いました。
SAMLはXMLベースのメッセージで、認証認可のために用意したIdPとSPの間で認証情報をやり取りする。
ソーシャルログインはソーシャルメディアのアカウントの認証情報を用いて、主にOIDCを使ってログインする。例えばGoogle, LINE, X等のソーシャルメディアのアカウントを使って認証する場合を指す。
何が違うのか
| 項目 | SSO (シングルサインオン) | SAML | ソーシャルログイン |
|---|---|---|---|
| 分類 | 目的、仕組み | プロトコル、規格 | SSOの具体的な手段(OIDCを使用) |
| 目的 | 一度の認証で複数システムを利用 | IdPとSP間の認証情報連携 | ソーシャルメディアアカウントを使用したSSO |
MFAと2段階認証
(前提)認証には以下の3要素がある。
知識情報 (Something You Know):パスワード、秘密の質問など
所持情報 (Something You Have):スマホ、ICカード、ハードウェアトークンなど
生体情報 (Something You Are):指紋、顔、静脈など
2段階認証
- 認証のプロセスを2段階行うこと。
- 要素が重複していても良い。
MFA(Multi Factor Authentication:多要素認証)
- 上記の認証3要素のうち、異なる2つ以上を組み合わせて認証すること。2段階認証よりもセキュア。
何が違うのか
| 項目 | 2段階認証 | MFA(多要素認証) |
|---|---|---|
| 定義 | 認証プロセスを2段階行うこと | 異なる要素を2つ以上組み合わせること |
| 要素の重複 | できる | できない |
認証認可に関わる概念の違いをまとめてみました。もし内容が間違っていたら教えてください🙇
理解の最初の足がかりになったら嬉しいです。