ゆるテックノート

SAMLとは?

SAML(Security Assertion Markup Language)は、「1回のログインで複数サービスを使える」SSO体験を実現するための仕組みです。ログイン結果を安全に受け渡すルールで、XML形式でやりとりされます。ここでは専門用語をなるべく避け、ざっくり理解できるように説明します。

🔐 SAMLの概要

SAMLは「ログイン結果」を安全に受け渡しするための決まりごとです。キーワードは以下の3つだけ覚えればOKです。

主要な登場人物

  • 📌 IdP(アイディーピー):ログインを担当する「認証サーバー」。社員ポータルやGoogle Workspaceなどがここに当たる。
  • 📌 SP(エスピー):実際に使いたいアプリ側。IdPが「この人はログインOK」と認めたら通してくれる門番。
  • 📌 アサーション:ログイン結果を包んだメモ。XMLで書かれ、改ざんされていないかをチェックできる。

🔁 SAMLの通信の流れ

大まかには「SPがIdPに紹介状を依頼し、IdPが結果を返す」流れです。ブラウザ経由で往復します。

主なステップ

  • ➡️ ユーザーが「使いたいサービス(SP)」にアクセスする
  • ➡️ SPが「この人は誰?」というリクエスト(SAMLRequest)を作り、ブラウザをIdPへ送る
  • ➡️ ユーザーがIdPでログインする(ID・パスワードや多要素認証など)
  • ➡️ IdPがログイン結果をSAMLResponseとして作り、ブラウザ経由でSPへ送り返す
  • ➡️ SPがSAMLResponseに署名があるか・改ざんされていないかをチェックし、OKならログイン完了

📨 SAMLRequest

SPからIdPへ送る認証要求。XMLをBase64で包み、RedirectやPOSTで送信します。

特徴

  • 🔍 SP → IdP への「紹介状をください」リクエスト。URL(Redirect)やフォーム(POST)で送られる。
  • 🔍 AuthnRequestとして送られ、Base64エンコードされたXML文字列。
  • 🔍 署名の要否はIdPポリシー次第(要求される場合は署名する)。

SAMLRequestの例

最小限のAuthnRequestの例(署名や暗号化は省略)。

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    ID="_req123" Version="2.0" IssueInstant="2024-01-01T00:00:00Z"
    Destination="https://idp.example.com/sso" AssertionConsumerServiceURL="https://sp.example.com/acs">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://sp.example.com/metadata</saml:Issuer>
</samlp:AuthnRequest>

Base64 / Redirect例

HTTP-RedirectではAuthnRequestをBase64(+必要ならDeflate圧縮)してクエリに載せます。

https://idp.example.com/sso?SAMLRequest=PHNhbWxwOkF1dGhuUmVxdWVzdCB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiBJRD0iX3JlcTEyMyIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMjQtMDEtMDFUMDA6MDA6MDBaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9pZHAuZXhhbXBsZS5jb20vc3NvIiBBc3NlcnRpb25Db25zdW1lclNlcnZpY2VVUkw9Imh0dHBzOi8vc3AuZXhhbXBsZS5jb20vYWNzIj48c2FtbDpJc3N1ZXIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI+aHR0cHM6Ly9zcC5leGFtcGxlLmNvbS9tZXRhZGF0YTwvc2FtbDpJc3N1ZXI+PC9zYW1scDpBdXRoblJlcXVlc3Q%3D

📄 SAMLResponse

IdPからSPへ返す認証結果。通常は署名され、必要に応じてAssertionが暗号化されます。

特徴

  • 🔍 IdP → SP の「この人はOKです」回答。通常は署名つきで改ざんチェック可能。
  • 🔍 Base64エンコードされたXMLとして返送され、POST(多くはPOST)で届く。
  • 🔍 署名や暗号化(Assertion)が有効になっている場合が多い。

SAMLResponseの例

Response単体のシンプルな例(署名や暗号化は省略)。

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Version="2.0" ID="_res123"
    IssueInstant="2024-01-01T00:00:05Z" Destination="https://sp.example.com/acs" InResponseTo="_req123">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://idp.example.com/metadata</saml:Issuer>
  <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_assert123" IssueInstant="2024-01-01T00:00:05Z">
    <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">user@example.com</saml:NameID>
      <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <saml:SubjectConfirmationData Recipient="https://sp.example.com/acs" InResponseTo="_req123"
          NotOnOrAfter="2024-01-01T00:05:05Z" />
      </saml:SubjectConfirmation>
    </saml:Subject>
  </saml:Assertion>
</samlp:Response>

Base64 / POST例

HTTP-POSTバインディングでは、Base64化したレスポンスをformに載せて自動送信します(例示用ダミーデータ)。

<form method="post" action="https://sp.example.com/acs">
  <input type="hidden" name="SAMLResponse" value="PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm4... (Base64レスポンス)..." />
  <input type="submit" value="Send" />
</form>

🌐 SAMLが使われる場面

「社内ポータルに入ったら他サービスもそのまま使える」ような体験を作るのに向いています。

利用例

  • 社内システムとクラウドサービスのシングルサインオン連携
  • Google WorkspaceやMicrosoft 365と外部アプリの連携
  • 複数のサービス間でログイン状態を共有したい場合