シングルサインオン(SSO)の仕組みSAML・OIDC・リバースプロキシまで
Googleでログイン、Google パスワード マネージャー、Okta SWA、Cloudflare Accessなどの具体例で学ぶSSOの基本。エージェント方式、代理認証方式、リバースプロキシ方式、SAML・OpenID Connectまで。通信経路、Cookie、トークン、負荷集中、セキュリティ対策を図解と操作ラボで解説します。
最初に押さえる結論
「一度のログインで複数サービスを使う」目的は同じ。でも、通信経路は方式ごとに異なる。
SSOは利用者が複数のサービスを利用するとき、サービスごとに資格情報を何度も入力する手間を減らす仕組みです。ただし、アプリ内で認証を確認するのか、入力を代行するのか、共通の入口を通すのか、外部のIdPと連携するのかで設計もリスクも変わります。
ログインの場所
IdP・端末・入口など
資格情報の種類
パスワード・Cookie・トークン
業務通信の経路
直通か、プロキシ経由か
1. SSOの前に、認証・認可・セッションを理解する
認証(Authentication)は本人であることの確認、認可(Authorization)はアクセス可能な操作の決定です。SSOによって複数サービスにログインできても、各サービスで同じ権限を持つとは限りません。
ログイン後、ブラウザはCookieなどに保持されたセッション識別子を使い、毎回パスワードを送らずに操作を続けます。共通ログイン状態と各アプリ自身のセッションは別々に管理されることがあります。例えばGoogleアカウントにログイン済みでも、Googleでログインした外部サービス側では別のCookieを発行・維持します。
認証
セッション
app_session Cookieを送り、アプリがログイン済みと判断する。認可
まず身近なサービスで区別する:どれがSSOで、どれが自動入力?
SSOを理解する近道は、普段目にするログイン画面を「誰が本人確認するか」「アプリに何が渡るか」で分類することです。ボタンの見た目が似ていても、裏側は別の仕組みです。
Google パスワード マネージャー
「Googleでログイン」
Microsoft 365から業務アプリへ
「Googleドライブへアクセスを許可」
2. SSOの4方式を一枚で比較する
四つの方式は呼び方が似ています。特にサーバーに導入するエージェントと端末でパスワードを代理入力するエージェントは別物です。
METHOD 01
サーバー組込み(エージェント)型
対象アプリに認証確認モジュールを導入し、共通ログイン状態を検証する
具体例:社内ポータルの各アプリサーバーに共通認証用プラグインを導入する構成。既存アプリを改修できる組織で採用される考え方。
SSO基盤と緊密に連携できる
METHOD 02
代理認証型
既存のログイン画面へ資格情報を自動入力する
具体例:実製品:Okta Secure Web Authentication(SWA)。従来型WebアプリのID・パスワードをSSO側で管理し、ログインフォームへ投入する。Google パスワード マネージャーの自動入力は似た動きだが、企業SSOと同一ではない。
古いパスワード認証のアプリにも適用しやすい
METHOD 03
リバースプロキシ型
入口で認証し、アプリへのリクエストとレスポンスを中継する
具体例:実製品:Cloudflare AccessやMicrosoft Entra アプリケーション プロキシ。社内の勤怠管理・管理画面などの前段に認証ゲートウェイを置く使い方。実装や中継経路は製品により異なる。
複数アプリの入口と認証ポリシーを集約できる
METHOD 04
認証連携(フェデレーション)型
SAMLアサーションやOIDCの認証結果によりログインを連携する
具体例:身近な例:「Googleでログイン」はOIDCを利用する例。企業ではMicrosoft Entra IDなどのIdPとSaaSをSAML/OIDCで連携する構成がある。
ドメイン・組織を越えたSSOに対応しやすい
3. 通信ラボ:5つのノードでSSOの違いを追う
同じ「ログイン後の業務アプリ利用」でも、ネットワーク上を流れる通信は変わります。各方式を切り替え、ブラウザ・代理入力エージェント・リバースプロキシ・IdP・対象アプリのどこを通信が通るか確かめてください。
INTERACTIVE SSO LAB
SSO方式別・通信の通り道
方式を選び「次の通信」で追跡。青い矢印は選択中の通信経路です。
STEP 1 / 5
入口へアクセス
ブラウザの接続先はアプリ群の前段に置かれたリバースプロキシ。
通信・データ例(模式表現)
GET https://portal.example.test/app-a/reports着眼点:入口が集約される
動作は説明用シミュレーションです。実際の通信・認証や資格情報の送信はしません。方式ごとの実装は製品により異なります。
プロキシとは? 「リバース」の意味を図で理解する
「proxy(プロキシ)」は「代理」を意味します。プロキシサーバーは、クライアントと目的のサーバーの間でHTTPリクエストなどを中継する仕組みです。フォワード(forward)とリバース(reverse)は、通信の矢印が逆向きだからではなく、誰の代理として動くかが違うと覚えると整理できます。
フォワードプロキシ(利用者側の代理)
会社のPCから外部サイトへアクセスするとき、会社のプロキシが代わりにリクエストを送る。
利用目的:URLフィルタリング、アクセスログ、出口の制御、キャッシュ。外部サイトからはプロキシがアクセス元に見える構成がある。
リバースプロキシ(サーバー側の代理)
インターネット上の利用者からのアクセスを、サービス側の入口が受けて内部アプリへ転送する。
利用目的:認証ゲートウェイ、ロードバランシング、TLS終端、キャッシュ、WAFとの連携。代表的なソフトウェアにNGINXなどがある。
| 比べるポイント | フォワード | リバース |
|---|---|---|
| 主に代理する側 | クライアント・利用者側 | Webサーバー・サービス側 |
| 典型的な配置 | 社内ネットワークの出口 | Webアプリの入口 |
| 身近なイメージ | 社内からのWeb閲覧を検査 | 複数サービスを共通URLで公開 |
| SSOとの関係 | 通信制御そのものはSSOではない | 入口でログイン確認を統一できる |
4. リバースプロキシ方式でアクセスが集中する理由
リバースプロキシは、利用者とバックエンドの間にある入口サーバーです。利用者が portal.example.test にアクセスすると、プロキシが裏側のアプリA・アプリBにリクエストを転送します。認証も入口側で処理・確認できます。
ブラウザ
GET /app-a
リバースプロキシ
SSO検証・中継
アプリ A / B
内部サービス
レスポンスは逆方向(アプリ → プロキシ → ブラウザ)に戻ります。典型的なインライン構成の例です。
GET /app-a/reports HTTP/1.1
Host: portal.example.test
Cookie: gateway_session=abc123
# リバースプロキシで認証状態を確認
# 内部アプリへ転送
GET /reports HTTP/1.1
Host: app-a.internal
X-Authenticated-User: alice # 信頼境界内でのみ使用する例
HTTP/1.1 200 OK
Content-Type: application/json
{"items":[...]}たとえばアプリAへの毎秒200リクエストとアプリBへの毎秒300リクエストがあり、すべてがプロキシを経由するなら、入口は合計で毎秒500リクエストを処理します。TLS終端、認証確認、ログ記録などの負荷も重なります。障害や帯域不足が複数アプリへ波及するため、複数台構成、ロードバランサー、ヘルスチェック、冗長ネットワーク、監視を検討します。
実務で見る4つの場面:ログイン画面の裏側
例1:古い勤怠システムをSSO化する
例2:社内管理画面を外部へ安全に公開する
例3:Googleアカウントで新規サービスに登録する
例4:会社のMicrosoftアカウントでSaaSへ入る
SAMLという名前を分解する:何の略で、何を表す?
SAML = Security Assertion Markup Language(セキュリティに関する主張を記述するマークアップ言語)。頭文字を順番に読むと、何を交換する技術なのかが見えてきます。
S:Security
A:Assertion
ML:Markup Language
例えば「会社のMicrosoft Entra IDにログイン済み」という情報を、別会社が運営する経費精算SaaSへ伝えるとき、IdPがSAMLアサーションを発行し、SPが信頼関係・署名・宛先・期限などを検証します。アサーションはパスワードそのものでも、URL形式の利用者IDを新規発行することでもありません。
| 略語 | 正式名称・語源 | 覚えるポイント |
|---|---|---|
| SAML | Security Assertion Markup Language | XMLのアサーションで認証情報を連携 |
| SSO | Single Sign-On | 一度のログインで複数のサービスへ |
| OIDC | OpenID Connect | OAuth 2.0上で本人認証・IDトークン |
| OAuth | Open Authorization | APIへのアクセス権限を委任 |
| IdP / SP | Identity Provider / Service Provider | 認証結果を提供する側 / サービスを提供する側 |
| JWT | JSON Web Token | JSONのクレームなどを表現するトークン形式 |
| PKCE | Proof Key for Code Exchange | 認可コード横取りへの対策 |
5. SAMLの基本:IdPとSPが署名付きアサーションで連携する
IdP(Identity Provider)は利用者を認証する側、SP(Service Provider)は業務アプリを提供する側です。SAML 2.0ではIdPが認証に関する主張をSAMLアサーションというXMLで表現します。例えば会社のMicrosoft Entra IDと、SAMLに対応した勤怠・経費精算などのSaaSを連携するケースを想像してください。企業IdPのログインが済むと、SaaSはIdPの署名付き証明を検証して自分のセッションを作ります。
<saml:Assertion>
<saml:Issuer>https://idp.example.test</saml:Issuer>
<saml:Subject>
<saml:NameID>alice@example.test</saml:NameID>
</saml:Subject>
<saml:Conditions NotBefore="..." NotOnOrAfter="...">
<saml:AudienceRestriction>
<saml:Audience>https://app.example.test/saml</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="..."/>
</saml:Assertion>
# 形を示すための簡略例。実際には署名・宛先などの要素を検証。SPは信頼するIdPの署名を検証し、送信先、発行者、対象受信者(Audience)、有効期間、リプレイ、InResponseToなどを確認します。単にXML内に「alice」と書いてあるからログインさせるわけではありません。
認証情報を含むSAMLアサーションは、ブラウザを経由するHTTP POSTバインディングなどでSPに渡されます。認証後の業務操作のたびにIdPへ通信する必要は通常ありません。
6. OpenID Connect(OIDC):OAuth 2.0を土台にした本人認証
OIDCはOAuth 2.0に認証のための仕組みを加えた規格です。OAuth 2.0は主にアクセスの委任(認可)を扱い、OIDCはユーザーが誰かを示すIDトークンなどを定義します。身近な例が「Googleでログイン」です。一方、「外部アプリにGoogleドライブの閲覧権限を与える」はOAuth 2.0の委任の例です。同じGoogleの認可画面が使われても、最終的な目的を分けて考えます。
認可コード
IDトークン
アクセストークン
GET https://idp.example.test/authorize? response_type=code &client_id=app-client &redirect_uri=https%3A%2F%2Fapp.example.test%2Fcallback &scope=openid &state=random-state &nonce=random-nonce &code_challenge=... &code_challenge_method=S256 # 認証完了後、ブラウザがアプリへ戻る GET /callback?code=abc123&state=random-state # アプリのバックエンド → IdP(バックチャネル) POST /token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=abc123&code_verifier=...
実装ではHTTPS、登録済みredirect URI、stateによるCSRF対策、nonce、PKCEなどを利用し、IDトークンの署名・発行者・受信者・期限を正しく検証します。アプリはトークンの検証後、自身のログインセッションを発行するのが一般的です。
OAuth 2.0の具体例:写真・カレンダー・GitHub連携
OAuth 2.0は「別サービスのパスワードを渡さずに、限定された操作を許可する」仕組みです。例えばカレンダー連携アプリがGoogleカレンダーの予定を読み取る、開発ツールがGitHubのリポジトリへアクセスする、といった連携を考えると理解しやすくなります。実際の許可内容は同意画面のスコープと、サービス側の権限設定で決まります。
① アプリが要求
② 利用者が同意
③ APIを呼び出す
# OAuth 2.0:APIアクセスの例(概念図) GET /calendar/v3/calendars/primary/events HTTP/1.1 Host: www.googleapis.com Authorization: Bearer ACCESS_TOKEN # OIDC:ログイン時にアプリが受け取るIDトークンとは役割が違う # access_token → API側が利用権限を判定 # id_token → ログイン先アプリがユーザー認証の情報を検証
7. SAML・OIDC・SSO実装方式を混同しないための整理
| 名称 | 主な役割 | 業務通信 |
|---|---|---|
| サーバー組込み型 | アプリ内の認証確認 | 原則アプリへ直接 |
| 代理認証型 | 既存ログイン欄への代理入力 | 原則アプリへ直接 |
| リバースプロキシ型 | 入口での認証・中継 | 対象通信がプロキシを通過 |
| SAML 2.0 | XMLアサーションによる認証連携 | 通常はログイン後にアプリへ直接 |
| OpenID Connect | OAuth 2.0を基盤にした認証連携 | 通常はログイン後にアプリへ直接 |
プロキシ型とSAML/OIDCは必ずしも排他的ではありません。例えばリバースプロキシがOIDCクライアントとしてIdPへ認証を委任し、その後のアプリ通信を中継する構成も作れます。「どこで認証を判断するか」と「どの規格でIdPと連携するか」は異なる設計軸です。
8. 実際のシステムで注意したい攻撃と運用課題
セッションの乗っ取り
署名・宛先検証の不備
認証の集中障害
ログアウトと権限変更
9. ありがちな説明を検証する
「SAMLはURL形式のIDを一人一つ自動発行して実現する」
「クライアントPCのエージェントがフォームを監視し、自動入力するのがサーバー組込み型」
「代理認証型では対象サーバーにSSOモジュールを必ず導入する」
「リバースプロキシ型では対象サービスのリクエストがプロキシに集中する」
10. よくある質問
SSOにしたらすべてのサイトで同じCookieが使える?
いいえ。Cookieにはドメイン・パス・SameSiteなどの制約があります。ドメインを越えるSSOにはSAMLやOIDCなどを用いて、各サービスで個別のセッションを作る構成もあります。
OIDCでは認証のたびに全API通信がIdPを経由する?
通常は違います。ログイン時にIdPへ移動しますが、その後の業務APIはアプリやAPIサーバーへ直接アクセスする構成が一般的です。
リバースプロキシは必ず単一障害点になる?
一台だけに依存させれば単一障害点になり得ます。ロードバランサー配下で複数台稼働させるなど、冗長化によりリスクを下げられます。
SSOでFIDOパスキーは使える?
使えます。IdPがパスキーで利用者を認証し、OIDCやSAMLでアプリへログイン結果を連携する構成があります。
一次資料・公式仕様
実装時は採用製品の資料に加えて、認証連携規格の原文とセキュリティガイドを確認してください。
- Google Developers — OpenID Connect / Sign in with Google
- Okta — Secure Web Authentication integrations
- Cloudflare — Access for web applications
- Microsoft Learn — Microsoft Entra application proxy
- OASIS — SAML V2.0 Technical Overview
- OpenID Connect Core 1.0
- RFC 6749 — The OAuth 2.0 Authorization Framework
- RFC 7636 — Proof Key for Code Exchange
- OWASP — Authentication Cheat Sheet
- OWASP — SAML Security Cheat Sheet