コンテンツにスキップ
LinkedInX

SSOと認証設計

約5分

対象読者: HTTPとWebアプリケーションの基礎を理解している方
前提知識: エンタープライズシステム入門 を読んでいること

シングルサインオン(SSO: Single Sign-On)とは、1回の認証で複数のサービスやアプリケーションにアクセスできる仕組みです。エンタープライズ環境では従業員が数十のシステムを使うため、SSOは運用コスト削減とセキュリティ強化の両面で不可欠な技術です。

従業員がSlack・Salesforce・GitHub・Jiraなど10〜30のSaaSを使う環境では、それぞれに個別のパスワードを管理すると以下の問題が生じます。

  • パスワードの使い回し・脆弱なパスワードの増加
  • 退職者アカウントの削除漏れによるセキュリティリスク
  • ヘルプデスクへの「パスワードを忘れた」問い合わせコスト

SSOでは1つのアイデンティティプロバイダー(IdP: Identity Provider)に認証を集約し、各サービス(SP: Service Provider)への認証をIdPが保証します。

OAuth 2.0とは、あるサービスが別のサービスのリソースにアクセスする際の「認可」フレームワークです。「認可(authorization)」は「何をしてよいか」を決める仕組みで、「認証(authentication)」の「誰であるか」とは異なります。

主なフロー:

フロー名用途特徴
認可コードフローWebアプリ最も安全・推奨
クライアントクレデンシャルフローサーバー間通信ユーザー不在のAPI連携
デバイスフローTVなどの入力制限デバイス別デバイスで認証

OIDC(OpenID Connect)とは、OAuth 2.0の上に「認証」レイヤーを追加した仕様です。OAuth 2.0が認可のみを扱うのに対し、OIDCはIDトークン(JSON Web Token形式)を発行することで「誰が認証したか」を証明します。

現代のSSOシステムではOIDCが標準的に採用されています。

SAML(Security Assertion Markup Language)2.0は、XMLベースの認証・認可仕様です。2005年策定の古い規格ですが、大企業のオンプレミスシステムやレガシーSaaSで広く使われています。OktaやMicrosoft Entra ID(旧Azure AD)はSAMLを完全サポートしています。

sequenceDiagram
    participant U as ユーザー
    participant App as アプリ(SP)
    participant IdP as アイデンティティプロバイダー

    U->>App: アクセス
    App->>U: IdPへリダイレクト
    U->>IdP: ログイン(ID/パスワード or MFA)
    IdP->>App: 認可コードを返却
    App->>IdP: 認可コード → アクセストークン + IDトークン交換
    IdP->>App: トークン発行
    App->>U: ログイン完了・セッション確立
比較項目OAuth 2.0OIDCSAML 2.0
目的認可(リソースアクセス)認証+認可認証+認可
データ形式JSONJWT(JSON)XML
策定年2012年2014年2005年
モバイル対応良好良好困難
エンタープライズ普及高い高い(増加中)非常に高い
実装の複雑さ低〜中低〜中高い

JWT(JSON Web Token)は、OIDC・OAuthで使われるトークン形式です。3つの部分をドット(.)で結合したBase64URL文字列で構成されます。

eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIn0.signature
      ↑ ヘッダー           ↑ ペイロード         ↑ 署名

ペイロードには以下のようなクレームが含まれます。

{
  "sub": "user123",
  "email": "alice@example.com",
  "exp": 1747123456,
  "iat": 1747119856,
  "iss": "https://auth.example.com"
}

exp(有効期限)を必ず検証し、期限切れトークンを拒否する実装が必要です。

Claude APIやOpenAI APIなどのLLMサービスをエンタープライズ環境に導入する場合、以下の設計が推奨されます。

  1. APIゲートウェイにSSOを適用: ユーザーはSSOでゲートウェイにアクセスし、ゲートウェイがLLM APIを呼び出す
  2. サービスアカウントのスコープ制限: AIサービス用のサービスアカウントには必要最小限の権限のみ付与
  3. トークンの伝播: JWTのクレームをAIサービスに伝播させ、ユーザー属性に基づいたアクセス制御を実現
項目推奨設定
アクセストークン有効期限15〜60分
リフレッシュトークン有効期限1〜30日
セッションタイムアウト(無操作)30〜60分
ログアウトIdP側でもセッションを無効化(Single Logout)
IdP特徴対応プロトコル
OktaSaaS特化・豊富なインテグレーションOIDC・SAML・OAuth 2.0
Microsoft Entra IDMicrosoft製品との親和性OIDC・SAML・OAuth 2.0
Google WorkspaceGoogle製品連携OIDC・SAML
Auth0(Okta傘下)開発者向け・カスタマイズ性高いOIDC・SAML・OAuth 2.0
  • トークンをlocalStorageに保存する: XSS攻撃でトークンが盗まれるリスクがある。httpOnly Cookieに保存する
  • トークンの有効期限を検証しない: 期限切れトークンを受け入れてしまう
  • IDトークンをAPIアクセストークンとして使う: IDトークンは認証用途のみ。APIアクセスにはアクセストークンを使う
  • Single Logoutを実装しない: IdPでログアウトしてもSP側のセッションが残る

Q: SAMLとOIDC、どちらを選ぶべきですか?

新規システムにはOIDCを推奨します。OIDCはJSON/JWTベースでモバイル・SPA対応が容易です。既存のSAMLをサポートするレガシーシステムとの連携が必要な場合はSAMLを選択します。両プロトコルをサポートするIdP(Okta・Microsoft Entra IDなど)を使うと、将来の移行が容易になります。

Q: SSOをローカル開発環境でテストするにはどうすればよいですか?

Keycloakをローカルで起動する方法が一般的です。Dockerで起動できます(docker run -p 8080:8080 quay.io/keycloak/keycloak:latest start-dev)。OktaやAuth0は無料のDeveloper Editionを提供しており、開発・テスト用途で利用できます。

Q: MFA(多要素認証)はSSOでどう組み合わせますか?

MFAはIdP側で実装します。SAMLやOIDCのフロー内でIdPがMFAを要求するため、各サービス(SP)に個別にMFAを実装する必要はありません。これがSSOとMFAを組み合わせる主要なメリットの一つです。

このページの外部仕様・背景情報は、参考文献を参照してください。[1][2]

  1. GitHub, GitHub Docs
  2. NIST, AI Risk Management Framework
クイズ