株式会社ジオデータ開発 ロゴ
株式会社ジオデータ開発GEO DATA DEVELOPMENT Inc.
IDENTITY & ACCESS MANAGEMENTSSOSAMLOpenID Connectリバースプロキシ

シングルサインオン(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を発行・維持します。

認証

例:IdPでパスキーやパスワードを検証し、誰であるかを確定する。

セッション

例:ブラウザが app_session Cookieを送り、アプリがログイン済みと判断する。

認可

例:同じ利用者でも、経理システムの閲覧権限と管理者権限は分ける。

まず身近なサービスで区別する:どれがSSOで、どれが自動入力?

SSOを理解する近道は、普段目にするログイン画面を「誰が本人確認するか」「アプリに何が渡るか」で分類することです。ボタンの見た目が似ていても、裏側は別の仕組みです。

Google パスワード マネージャー

保存していたサイトごとのユーザー名・パスワードを、ログインフォームに入力する。SSOそのものではなくパスワード管理・自動入力。各サイトがパスワードを検証します。

「Googleでログイン」

外部サイトがGoogleによるログイン結果を利用する。OpenID Connect(OIDC)を使う代表例で、Google側が認証を担い、外部サイトがIDトークンなどを検証します。

Microsoft 365から業務アプリへ

Microsoft Entra IDにサインインし、設定された業務アプリを追加のパスワード入力なしで開く。連携先・構成によってSAML、OIDC、アプリケーションプロキシ等を利用します。

「Googleドライブへアクセスを許可」

別アプリがGoogleドライブのファイルへアクセスできるよう、利用者が権限を承認する。これは主にOAuth 2.0によるアクセス委任であり、ログインそのものとは役割が違います。

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で連携する構成がある。

配置:IdPと各サービス

ドメイン・組織を越えたSSOに対応しやすい

注意点:署名、issuer、audience、redirect URI、stateなどの検証ミス

3. 通信ラボ:5つのノードでSSOの違いを追う

同じ「ログイン後の業務アプリ利用」でも、ネットワーク上を流れる通信は変わります。各方式を切り替え、ブラウザ・代理入力エージェント・リバースプロキシ・IdP・対象アプリのどこを通信が通るか確かめてください。

INTERACTIVE SSO LAB

SSO方式別・通信の通り道

方式を選び「次の通信」で追跡。青い矢印は選択中の通信経路です。

利用者から対象アプリへのHTTP(S)通信が前段ゲートウェイを通る。集中点になるため冗長化が重要。
利用者ブラウザHTTPSの起点端末エージェント代理入力リバースプロキシ入口ゲートウェイ認証基盤(IdP)ログインを検証対象アプリ業務データを提供

STEP 1 / 5

入口へアクセス

ブラウザの接続先はアプリ群の前段に置かれたリバースプロキシ。

通信・データ例(模式表現)

GET https://portal.example.test/app-a/reports

着眼点:入口が集約される

動作は説明用シミュレーションです。実際の通信・認証や資格情報の送信はしません。方式ごとの実装は製品により異なります。

プロキシとは? 「リバース」の意味を図で理解する

「proxy(プロキシ)」は「代理」を意味します。プロキシサーバーは、クライアントと目的のサーバーの間でHTTPリクエストなどを中継する仕組みです。フォワード(forward)とリバース(reverse)は、通信の矢印が逆向きだからではなく、誰の代理として動くかが違うと覚えると整理できます。

フォワードプロキシ(利用者側の代理)

会社のPCから外部サイトへアクセスするとき、会社のプロキシが代わりにリクエストを送る。

社内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化する

以前から使っている勤怠システムにはSAMLやOIDCがない。Okta SWAのような代理入力型でログインID・パスワードを登録し、利用者には共通ポータルから起動させる。勤怠システム側は従来どおりパスワード認証を行うため、MFA対応などは別途設計が必要です。

例2:社内管理画面を外部へ安全に公開する

開発チームの管理画面をインターネットに直接公開せず、Cloudflare Accessなどの認証ゲートウェイの背後に配置する。利用者はゲートウェイで認証され、許可されたリクエストがアプリへ届く。認証判定と業務HTTP通信の双方が入口に関係する例です。

例3:Googleアカウントで新規サービスに登録する

サービスの「Googleでログイン」を押すとGoogleの認証画面へ遷移。戻ってきた認可コードなどを使ってサーバーがIDトークンを受け取り、署名・受信者・有効期限などを検証。サービス側では自分のセッションCookieを発行します。以降の画面操作すべてがGoogleを通るわけではありません。

例4:会社のMicrosoftアカウントでSaaSへ入る

会社で使うSaaSがEntra IDとのSAML連携に対応していれば、SaaSへのアクセス時にEntra IDへ移動して認証し、SAMLレスポンスを返してログインできます。認証はIdP、業務機能はSaaSという責任分担です。接続方式はSaaSごとの設定に依存します。

SAMLという名前を分解する:何の略で、何を表す?

SAML = Security Assertion Markup Language(セキュリティに関する主張を記述するマークアップ言語)。頭文字を順番に読むと、何を交換する技術なのかが見えてきます。

S:Security

セキュリティの文脈。ログインした主体や認証時刻など、信頼を扱う。

A:Assertion

「主張・表明」。IdPが「この利用者を認証した」などとSPに伝える情報のまとまり。

ML:Markup Language

情報をタグで構造化する記述言語。SAMLではXMLで表現する。

例えば「会社のMicrosoft Entra IDにログイン済み」という情報を、別会社が運営する経費精算SaaSへ伝えるとき、IdPがSAMLアサーションを発行し、SPが信頼関係・署名・宛先・期限などを検証します。アサーションはパスワードそのものでも、URL形式の利用者IDを新規発行することでもありません。

略語正式名称・語源覚えるポイント
SAMLSecurity Assertion Markup LanguageXMLのアサーションで認証情報を連携
SSOSingle Sign-On一度のログインで複数のサービスへ
OIDCOpenID ConnectOAuth 2.0上で本人認証・IDトークン
OAuthOpen AuthorizationAPIへのアクセス権限を委任
IdP / SPIdentity Provider / Service Provider認証結果を提供する側 / サービスを提供する側
JWTJSON Web TokenJSONのクレームなどを表現するトークン形式
PKCEProof 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トークン

認証に関する情報を示すトークン。通常JWT形式。署名やiss、aud、exp、nonceなどを検証する。

アクセストークン

保護されたAPIへのアクセス権限を示す。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のリポジトリへアクセスする、といった連携を考えると理解しやすくなります。実際の許可内容は同意画面のスコープと、サービス側の権限設定で決まります。

① アプリが要求

「Googleカレンダーの予定を読み取ってよいですか?」のように必要なスコープを要求する。

② 利用者が同意

Googleなどの認可サーバーが利用者に権限の範囲を示し、許可を確認する。

③ APIを呼び出す

アプリがアクセストークンを付けてカレンダー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.0XMLアサーションによる認証連携通常はログイン後にアプリへ直接
OpenID ConnectOAuth 2.0を基盤にした認証連携通常はログイン後にアプリへ直接

プロキシ型とSAML/OIDCは必ずしも排他的ではありません。例えばリバースプロキシがOIDCクライアントとしてIdPへ認証を委任し、その後のアプリ通信を中継する構成も作れます。「どこで認証を判断するか」と「どの規格でIdPと連携するか」は異なる設計軸です。

8. 実際のシステムで注意したい攻撃と運用課題

セッションの乗っ取り

CookieにSecure・HttpOnly・適切なSameSiteを設定し、セッション固定化や漏えいを防ぐ。SSO基盤のセッション有効期間も管理する。

署名・宛先検証の不備

SAMLの署名、Audience、DestinationやOIDCのiss、aud、nonce等を検証し、別の利用者・サービス向けの認証情報を受理しない。

認証の集中障害

例えば会社のIdPが停止すると新規のSaaSログインが失敗することがある一方、インラインの認証ゲートウェイが停止すると既存の管理画面通信も止まる可能性がある。影響範囲に合わせて冗長化する。

ログアウトと権限変更

IdPからログアウトしても各アプリのセッションが残る場合がある。権限剥奪、プロビジョニング、シングルログアウトの設計を行う。

9. ありがちな説明を検証する

「SAMLはURL形式のIDを一人一つ自動発行して実現する」

誤解です。SAMLはIdPとSPが署名付きのXMLアサーションなどで認証情報を連携します。URL形式の識別子を中心に語るのは従来のOpenIDの説明と混同しています。

「クライアントPCのエージェントがフォームを監視し、自動入力するのがサーバー組込み型」

誤解です。端末でID・パスワードを代行入力するなら代理認証型。サーバー組込み型はアプリ側にSSOモジュールを設置します。

「代理認証型では対象サーバーにSSOモジュールを必ず導入する」

誤解です。代理認証型は既存のログインフォームへの代理入力が特徴。対象サーバーのモジュール導入は別方式の特徴です。

「リバースプロキシ型では対象サービスのリクエストがプロキシに集中する」

典型的なインライン構成ではその通りです。レスポンスも通るので負荷・可用性・容量設計が重要になります。ただし対象外の通信まで集中する意味ではありません。

10. よくある質問

SSOにしたらすべてのサイトで同じCookieが使える?

いいえ。Cookieにはドメイン・パス・SameSiteなどの制約があります。ドメインを越えるSSOにはSAMLやOIDCなどを用いて、各サービスで個別のセッションを作る構成もあります。

OIDCでは認証のたびに全API通信がIdPを経由する?

通常は違います。ログイン時にIdPへ移動しますが、その後の業務APIはアプリやAPIサーバーへ直接アクセスする構成が一般的です。

リバースプロキシは必ず単一障害点になる?

一台だけに依存させれば単一障害点になり得ます。ロードバランサー配下で複数台稼働させるなど、冗長化によりリスクを下げられます。

SSOでFIDOパスキーは使える?

使えます。IdPがパスキーで利用者を認証し、OIDCやSAMLでアプリへログイン結果を連携する構成があります。

一次資料・公式仕様

実装時は採用製品の資料に加えて、認証連携規格の原文とセキュリティガイドを確認してください。