40
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「ログイン周り」がごちゃつく人へ:認証・認可・SSO・OAuth/OIDC/SAMLの地図

Posted at

「OAuthで認証してます」
「SSOってSAMLのこと?」
「OIDCってOAuthの上位互換?」

このあたり、言葉の形が似ていて普通に混ざります。
で、混ざったままでも開発は進んでしまうので、なおさら厄介です。

ただ、ここで詰まる原因は「専門用語が多いから」じゃなくて、もっと単純で、種類の違う言葉が同じレイヤーに置かれがち だからだと思っています。

  • 体験の名前(SSO)
  • 信頼のつなぎ方(フェデレーション)
  • 登場人物の役割(IdP / SP)
  • 受け渡しのルール(OAuth / OIDC / SAML)

レイヤーを分ければ、用語が多くても意外と迷子になりません。この記事はそのための整理です。

TL;TD

  • 認証(AuthN):あなたは誰?
  • 認可(AuthZ):あなたは何ができる?
  • SSO:1回ログインで複数サービスを使える「体験」
  • フェデレーション:別システムの認証結果を「信頼して受け取る」仕組み
  • IdP:本人確認して「認証済み」を発行する側
  • SP/RP:それを受け取って検証し、サービスを提供する側
  • Auth 2.0:権限を委譲する(認可)
  • OIDC:OAuth 2.0 の上に「認証(ID Token)」を追加
  • SAML 2.0:企業SSOでよく見る、認証結果をアサーションで渡す方式

まずは“困りごと”から:社員1000人の現実

会社に社員が1000人いるとして、サービスを増やすたびにそのサービス用のユーザーを作る世界を想像してみてください。

  • SaaSを導入するたびにユーザー1000人作成
  • 退職した人の削除が漏れる
  • 異動した人の権限が追いつかない
  • 誰がどこに入れるか棚卸しが終わらない
  • パスワードが増えて、どこかで事故る

たぶん「運用のしんどさ」が最初に限界を迎えます。
だから現実的には、方針がこう変わります。

  • 本人確認は“会社の中心”で一回
  • 各サービスは その結果を信頼して受け取る
  • できればユーザーは「一回ログイン」で済ませたい

この要求を言葉にすると、SSOやフェデレーションの話になっていきます。

全体像:どの棚に置く言葉か(地図)

いきなり細かい話に入ると混ざるので、先に位置関係だけ置きます。

ここで重要なのは、「SSO・フェデレーション・SAML/OIDC」が横並びじゃないことです。

  • SSOは「ユーザーの体験名」(一回ログインで済むと嬉しい)
  • フェデレーションは「信頼でつなぐ仕組み」(Aの認証結果をBが受け入れる)
  • SAML / OIDCは「その受け渡しをするための規格」
  • OAuth 2.0は別棚で「認可(権限委譲)」の話。OIDCはその上に認証を足す

「SSO = SAML」みたいに言い切るとズレるのは、SSOが“体験の名前”で、SAMLが“規格(ルール)”だからです。
より正確には「SSOを実現するためにSAMLを使うことがある」です。

認証(誰?)と認可(何していい?)

Auth周りが噛み合わないとき、だいたいここが混ざっています。

  • 認証(Authentication / AuthN):あなたは誰?
  • 認可(Authorization / AuthZ):あなたは何ができる?

ホテルでたとえるとシンプルです。

チェックインで本人確認(認証)
  ↓
部屋キーで入れる範囲が決まる(認可)

Webでも似た話がよく起きます。

  • 401:あなた誰?(認証が必要/失敗)
  • 403:あなたは分かったけど、それはダメ(認可で拒否)

「ログインできるのに403が出る」のは、認証は成功していて、権限が足りないだけ…というケースが本当に多いです。

SSOは“体験”, フェデレーションは“信頼の仕組み”

SSOはユーザー目線です。

  • 朝イチでポータルにログインしたら
  • 以降、勤怠もメールも社内Wikiも、追加ログインなしで使える

「便利だな」という感覚がSSOです。

一方、フェデレーションはシステム目線です。

  • 会社の認証基盤が「この人は田中さん」と認証する
  • 勤怠システムがその結果を信頼してログインさせる
  • メールも同じ
  • 社内Wikiも同じ

つまりフェデレーションは「Aが認証した結果を、Bが受け入れる」という信頼の仕組みです。
SSOという体験を支える土台として、フェデレーションがよく登場します。

ここでありがちな勘違いがひとつあります。

  • フェデレーションは“誰か”ではなく、“仕組み”
  • その仕組みの中に登場人物(役割)がいる

次で、その登場人物をはっきりさせます。

IdPとSP/RP:フェデレーションの登場人物(役割)

フェデレーションを現実の構成に落とすと、だいたい登場人物はこの2つです。

  • IdP(Identity Provider):認証する側。ログイン元。本人確認して「認証済み」を発行する
  • SP(Service Provider)/ RP(Relying Party):サービス提供側。IdPの結果を受け取り、検証してログインを成立させる

図にするとこうです。

   認証する側(IdP)                        サービス提供側(SP/RP)
+-------------------+   認証結果を渡す     +------------------------+
| IdP               | -----------------> | SP / RP                |
|  本人確認する       |                    | 受け取って検証して        |
| 「認証済み」を発行   |                    | サービスを提供する        |
+-------------------+                    +------------------------+
          ^
          |
     ユーザーはIdPでログインする

ここが「フェデレーションの中身ってIdP?」という疑問につながりやすいところですが、関係はこうです。

  • フェデレーション:Aの認証結果をBが受け入れる “仕組み全体”
  • IdP:その中の「認証して結果を出す役割」
  • SP/RP:その結果を受け取って利用させる役割

そして SAMLやOIDCは、IdP→SP/RPに“認証済み”を渡すためのルールです。
「誰が何を渡すか」がわかると、用語が急に安定します。

OAuth 2.0:パスワードを渡さず、権限だけ渡す(認可の話)

ここまでの話は「ログイン(認証)」寄りでした。
OAuth 2.0 は棚が違って、主役はログインではなく 権限の委譲です。

たとえばこういうやつ。

  • 写真プリントのアプリが「あなたの写真」を読み取りたい
  • でもアプリにGoogleのID/PWを渡すのは嫌
  • 「写真の読み取りだけOK」みたいに範囲を絞って許可したい

このときに出てくるのがOAuth 2.0です。
流れを“体感”で追うとこうなります(最後にユーザーへ結果が返るところまで描きます)。

OAuth 2.0 がやっているのは、ざっくり言うとこれです。

  • ID/PWを渡さない
  • 代わりに「この範囲だけOK」な通行証(Access Token)を渡す

だから「OAuthで認証してます」と言うと、文脈によってはズレます。OAuthの中心はあくまで“許可(認可)”です。

OIDC:OAuth 2.0 に「あなたは誰か」を足す(ログインっぽくなる理由)

OAuth 2.0 の世界だけだと、「このトークンで写真APIを読める」は表現できます。
でもアプリ側はだいたいこう言い出します。

  • 「この人をユーザーとして登録したい」
  • 「ログイン状態を作りたい」
  • 「メールアドレスやユーザーIDがほしい」

ここで OIDC が出てきます。OIDCはOAuth 2.0 の仕組みを使いつつ、認証の結果(あなたは誰か) を扱えるようにしたものです。
そのために出てくるのが ID Token です。

混ざりやすいので、トークンは用途で切ると楽です。

Access Token  : APIに行くための通行証(権限)
ID Token      : "あなたは誰か" の身分証(ユーザー情報)
Refresh Token : Access Tokenを更新する鍵

OIDCが「認証 + 認可」に見えるのは、現場では Access Token も一緒に扱うことが多いからです。
ただ、OIDCが“追加している本体”は「認証(ID Token)」の側だと押さえておくと、混線しにくくなります。

SAML 2.0:企業SSOでよく見る“認証結果の受け渡し”

SAMLは企業SSOでよく見かけます。
構造は意外と素直で、IdPが認証して、その結果をSPに渡す、という形です。

OIDCとSAMLは世界観が違って見えるかもしれませんが、骨格は似ています。

  • IdPが認証する
  • SP/RPが受け取り検証する
  • ログインが成立する

違いは「何をどう渡すか」というルール(規格)の部分です。

まとめ

Auth周りがややこしく感じるのは、単語の暗記が足りないからというより、違う種類の言葉が同じレイヤーに置かれがちだからだと思っています。

  • 認証(誰?)と認可(何していい?)を分ける
  • SSOは体験、フェデレーションは信頼の仕組み
  • フェデレーションの登場人物が IdP と SP/RP
  • OAuth 2.0 は認可(委譲)
  • OIDCはOAuthの上に認証(ID Token)を足す
  • SAMLは企業SSOでよく見る認証連携

このレイヤー分けができると、会話の中で「今どのレイヤーの話?」が掴みやすくなって、仕様も実装も追いやすくなります。

40
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?