SAML

企業の ID プロバイダーとサービスプロバイダー間でシングルサインオンを実現する XML ベースの認証プロトコル

認証

SAML とは

SAML (Security Assertion Markup Language) は、ID プロバイダー (IdP) とサービスプロバイダー (SP) の間で認証・認可情報を XML 形式で交換するプロトコルである。2005 年に OASIS が SAML 2.0 を標準化し、エンタープライズ SSO の事実上の標準になっている。

認証フロー (SP-Initiated)

1. ユーザーが SP (例: Slack) にアクセス
2. SP が SAML AuthnRequest を生成し、IdP にリダイレクト
3. ユーザーが IdP (例: Okta) でログイン
4. IdP が SAML Response (Assertion) を生成
5. ブラウザが SAML Response を SP に POST
6. SP が Assertion を検証し、ログイン完了

[ユーザー][SP: Slack] → リダイレクト → [IdP: Okta]
                                              ↓ ログイン
[ユーザー][SP: Slack] ← POST Assertion ← [IdP: Okta]

SAML Assertion の構造

<saml:Assertion>
  <saml:Issuer>https://idp.example.com</saml:Issuer>
  <saml:Subject>
    <saml:NameID>user@example.com</saml:NameID>
  </saml:Subject>
  <saml:Conditions NotBefore="..." NotOnOrAfter="...">
    <saml:AudienceRestriction>
      <saml:Audience>https://sp.example.com</saml:Audience>
    </saml:AudienceRestriction>
  </saml:Conditions>
  <saml:AttributeStatement>
    <saml:Attribute Name="role">
      <saml:AttributeValue>admin</saml:AttributeValue>
    </saml:Attribute>
  </saml:AttributeStatement>
</saml:Assertion>

Assertion は XML 署名で改ざんを防止する。SP は IdP の公開鍵で署名を検証する。

OIDC との比較

観点 SAML 2.0 OpenID Connect
データ形式 XML JSON / JWT
用途 エンタープライズ SSO Web / モバイルアプリ
実装の複雑さ 高い (XML 署名、パース) 低い (JSON、JWT)
モバイル対応 不向き 適している
普及度 エンタープライズで標準 コンシューマー向けで標準

新規プロジェクトでは OIDC が推奨される。SAML は既存のエンタープライズ IdP (Active Directory、Okta) との連携で使われる。

AWS での SAML 連携

  • IAM Identity Center: SAML IdP と連携し、AWS アカウントへの SSO を提供
  • Cognito User Pool: SAML IdP をフェデレーション ID プロバイダーとして設定し、アプリケーションの SSO を実現
  • IAM SAML プロバイダー: SAML Assertion で一時的な AWS 認証情報を取得

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語