(ちょっと噛み砕いた)SAML入門

## 概要
一部脱線しながら、SAMLの概要とSAMLを利用した認証フローについてまとめています。
脱線したり無駄に深掘りした部分の記載も多いですがご了承ください。

・SAMLがどういうものか知りたい
・SAML自体は聞いたことがあるけど、詳細な仕様は知らない

上記のような方を対象とした記事です。

## SAMLとは?
Security Assertion Markup Languageの略で、**異なるセキュリティドメイン間**で認証情報を連携するための標準仕様です。
XMLベースのデータを用いて認証情報をやりとりします。
「データの中身」や「やりとりの方法」など具体的な内容は後述します。

#### SAMLの登場背景について
早速脱線しますが、SAMLが必要となった背景についてもまとめておきます。
SAMLの登場背景としては、下記のような要因が挙げられます。

**1. サービスプロバイダ側のセキュリティ対策の負担軽減**
サービスを提供する際のセキュリティ要求レベルが高まるにつれて、サービスプロバイダが認証/認可/属性取得処理を全てを一から実装するのではなく、**機能を外出しすることでサービスプロバイダの負担を軽減する**という流れが生まれました。

参考：https://www.jnsa.org/seminar/1209/endou.pdf

**2. 外部サービスとのシームレスな連携**
既存のSSOでは異なるセキュリティドメイン間(ex. 企業システム - SalesforceなどのSaaS)での認証情報の連携ができないという問題点がありました。

一方で、SaaSなどの外部サービスの利用増加に伴い、**異なるセキュリティドメイン間で認証情報を連携したい**というニーズは高まっていました。
それと同時に、企業システムと外部サービスの連携時に**統一的なセキュリティポリシーの元で外部サービスを利用したい**という要望も発生しました。

参考：https://www.slideshare.net/paoneJP/id-52056023

上記のニーズ(困りごと)を解決する策として、SAMLが誕生・普及するようになりました。

#### (補足)セキュリティドメインとは?
[開発者のためのセキュリティアーキテクチャ概説(IPA)](https://www.ipa.go.jp/files/000014502.pdf)では、「プログラムの動作による攻撃・
悪影響を受けないように、**そのプログラムがアクセスできる範囲を限定した**範囲や環境」と定義しています。
上記の定義から、Salesforce, Dropboxなどのサービスや企業システムはそれぞれ単一のセキュリティドメインであると言えます。

## SAMLの構成要素
ここでは、SAMLの構成要素(**「データの中身」**)について説明していきます。
[Technical Overview](https://www.oasis-open.org/committees/download.php/27819/sstc-saml-tech-overview-2.0-cd-02.pdf)ではSAMLの構成要素として下記が記載されています。
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170549/198d8536-db19-0da7-4094-55fe9a684d74.png)

- **Assertions**：対象の認証情報や属性、認可情報をXMLベースで記載したデータ
- **Protocols**：Assertionsを詰めたメッセージを交換する際のRequest/Responseの仕様
- **Bindings**：Protocolsを通信プロトコル(HTTP,SOAP)にマッピングする方法を定義したもの
- **Profiles**：Bindings, Protocols, Assertionsの組み合わせを定義したもの

実際にIdPによって発行されたAssertionsを見てみます。
Assertionsの発行者情報(**Issuer**)、認証/認可の対象となる主体の情報(**Subject**)などが記載されています。

個々の情報に関する説明は割愛しますが、説明自体は下記のドキュメントに記載されています。

- [saml-core-2.0-os.pdf](http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)
- [医療分野共通認証基盤整備コンソーシアム提供のpdf](https://www.nttdata-strategy.com/medit/pdf/240423/7-data.pdf)


```xml:ex)Assertions
<saml:Assertion ID="Assertion-uuid1ad8a08a-016b-10e9-9614-839c4029e276"
                    IssueInstant="2019-06-03T00:58:52Z"
                    Version="2.0"
                    >
    <!--Assertion >【Issuer】-->
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://issuer.com/saml/</saml:Issuer>
    <!--Assertion >【Signature】-->
    <ds:Signature Id="uuid1ad8a08b-016b-11fc-a044-839c4029e276">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
            <ds:Reference URI="#Assertion-uuid1ad8a08a-016b-10e9-9614-839c4029e276">
                ...
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>...</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>...</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
    <!--Assertion > 【Subject】-->
    <saml:Subject>
        <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">hoge@gmail.com</saml:NameID>
        <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
            <saml:SubjectConfirmationData InResponseTo="..."
                                            NotOnOrAfter="2019-06-03T00:59:52Z"
                                            Recipient="https://huga.my.salesforce.com?so=00D2v010012rOU"
                                            />
        </saml:SubjectConfirmation>
    </saml:Subject>
    <!--Assertion > 【Conditions】-->
    <saml:Conditions NotBefore="2019-06-03T00:57:52Z"
                        NotOnOrAfter="2019-06-03T00:59:52Z"
                        >
        <saml:AudienceRestriction>
            <saml:Audience>https://huga.my.salesforce.com</saml:Audience>
        </saml:AudienceRestriction>
    </saml:Conditions>
    <!--Assertion > 【Statement】-->
    <saml:AuthnStatement AuthnInstant="2019-06-03T00:58:52Z"
                            SessionIndex="uuid1ad76845-016b-1bf3-a323-839c4029e276"
                            SessionNotOnOrAfter="2019-06-03T01:58:52Z"
                            >
        <saml:AuthnContext>
            <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
        </saml:AuthnContext>
    </saml:AuthnStatement>
</saml:Assertion>
```

また、上記以外の要素として下記の2つが存在します。
・[**Authentication Context**](https://docs.oasis-open.org/security/saml/v2.0/saml-authn-context-2.0-os.pdf)：IdP側からSPへの追加情報、認証方式の制御に利用される
・[**Metadata**](https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf)：IdP/SPに関する情報(エンドポイントURLや利用可能なBinding etc...)を記載したもの

Assertionsに関しては、3種類のStatementsが存在します。
・**Authentication statements**：認証時に利用された手段と時刻などの情報
・**Attribute statements**：ユーザーの属性に関する情報
・**Authorization decision statements**：ユーザー対する権限の付与状況

先ほどのAssertionsには、Authentication statementsが含まれています。

```xml:ex)Authentication&nbsp;statements
<saml:AuthnStatement AuthnInstant="2019-06-03T00:58:52Z"
                     SessionIndex="uuid1ad76845-016b-1bf3-a323-839c4029e276"
                     SessionNotOnOrAfter="2019-06-03T01:58:52Z"
                     >
         <saml:AuthnContext>
             <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
        </saml:AuthnContext>
</saml:AuthnStatement>
```

## SAMLを利用した認証フローの種類
SAMLを利用したフロー(**「やりとりの方法」**)の種類について説明していきます。
今回は、Web Browser SSO Profileとして紹介されている認証フローから3つ紹介します。

フローの種別は、下記の2つの観点によって異なります。
・フローがIdP/SPのどちらで開始するか
・IdP/SP間でのメッセージのやりとりの方法(Bindings)の設定 

#### 1. SP-Initiated SSO with Redirect and POST Bindings
(**フローの開始主体**：SP、**Bindings**: Redirect & POST)

SPが認証要求のメッセージである**AuthnRequest**を送り、最終的にIdP側がAssertionsなどの認証情報を詰めた**AuthnResponse**を返すフローです。
後述する2つの認証フローと比較しても実装コストが低く、高い頻度で利用されています。

![20160712230753.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170549/b33ca4b4-2199-17aa-1f35-0bb7c3278f35.gif)

#### 2. SP-Initiated SSO with POST and Artifact Bindings
(**フローの開始主体**：SP、**Bindings**: POST & Artifact)

Assertionsなどを詰めたAuthnResponseをやりとりする際に**IdP/SP間で直接やりとり**するフローが存在することが特徴です。
ブラウザを介さないため、セキュリティ面でより安全な方法となっています。
ただし、IdP/SP間の通信経路を事前に準備する必要があり実装コストが高くなります。

![sstc-saml-tech-overview-2.0-cd-02_html_19b6d40c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170549/b62294bd-c3aa-b87b-0c1c-311a537779b5.gif)

#### 3. IdP-Initiated SSO with POST Binding
(**フローの開始主体**：IdP、**Bindings**: POST) 

**フローの開始主体がIdPとなっている**認証フローの一つです。
ユーザーはアクセスできるサービス一覧(UI)からサービスを選択してフローが始まります。
このフローでは、アクセス可能なサービスのデータをIdP側が保有しておく必要があります。

![20160712230805.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170549/63ecb721-70d6-27f3-b515-24ec3b7277b7.gif)

## SAMLを利用した認証フローの詳細
SP-Initiated SSO with Redirect and POST Bindingsを例に挙げて、フローの詳細についてまとめています。
![20160712230753.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170549/b33ca4b4-2199-17aa-1f35-0bb7c3278f35.gif)

フローの前提として、IdP/SPは下記のようなエンドポイントURLを有していると仮定します。
・IdP(AuthnResponse発行用URL)：https://idp.com/saml/sso/issue
・IdP(ログイン用URL)：https://idp.com/saml/sso/login
・SP(※今回はSalesforceを利用)：https://sp-saml.my.salesforce.com

#### 0. IdP/SPでの設定情報の入力
SAMLの特徴でもありますが、SAMLによるSSOを実現する際にはIdP/SP間で必要な情報を事前に設定しておく必要があります。
SP(Salesforce)を例に挙げると、下記のような情報を設定する必要があります。
・(AuthnRequest)の発行者
・IdPのログインURL
・IdPの証明書

下2つに関しては、IdP側に依存する情報なのでIdPの設定を事前に確認しておきます。
![スクリーンショット 2019-09-12 18.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170549/58fe9de0-d7e0-35e7-17d6-5aa489cfaece.png)


#### 1. リソースへのアクセス
ユーザーが任意のリソースに対してアクセスを要求します。
このアクセス要求をトリガーとして、SP側で認証要求のリクエスト(**AuthnRequest**)が発行されます。

AuthnRequestには、下記のような情報が埋め込まれています
・AuthnRequestの発行者(**Issuer**)
・AuthnRequestの送信先のエンドポイントURL(**Destination**)
・AuthnResponseを受け取るエンドポイントのURL(**AssertionConsumerServiceURL**)
・Bindingsの種類(**ProtocolBinding**)


```xml:AuthnRequest
<!--SAML - 【Request】-->
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                    AssertionConsumerServiceURL="https://sp-saml.my.salesforce.com?so=00D2v0000012rOU"
                    Destination="https://idp.com/saml/sso/login"
                    ID="_2CAAAAWurCXQMME8wMnYwMDAwMDA4T0k1AAAA2uZdjJowCaogMhVR698OWjozA-yYTZwj7ShPT6EfHaJgIY7pApTbs6XVGMp9sXwqgDL-dHeNiVxW3xvFCI9ehYuw3NuUqPMyGPvxHD_M264Ox70z0qtoCombnnCYClvAj7Rg1F-jEbQEQyG-wwW_WZ677-UngSHvsctoAwBOkWV-WlPGNxCERjotap58UQ7_8A51Yvb45mcRrlIkMZbVU3KVgkwbzFGSxB-ESZ1s-g0gGP43sJe-RMatD3ER1U_Prw"
                    IssueInstant="2019-06-03T00:57:32.385Z"
                    ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                    Version="2.0"
                    >
    <!--SAML - Request > 【Issuer】-->
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://sp-saml.my.salesforce.com</saml:Issuer>
    <!--SAML - Request > 【Signature】-->
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
            <ds:Reference URI="#_2CAAAAWurCXQMME8wMnYwMDAwMDA4T0k1AAAA2uZdjJowCaogMhVR698OWjozA-yYTZwj7ShPT6EfHaJgIY7pApTbs6XVGMp9sXwqgDL-dHeNiVxW3xvFCI9ehYuw3NuUqPMyGPvxHD_M264Ox70z0qtoCombnnCYClvAj7Rg1F-jEbQEQyG-wwW_WZ677-UngSHvsctoAwBOkWV-WlPGNxCERjotap58UQ7_8A51Yvb45mcRrlIkMZbVU3KVgkwbzFGSxB-ESZ1s-g0gGP43sJe-RMatD3ER1U_Prw">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"
                                                PrefixList="ds saml samlp"
                                                />
                    </ds:Transform><samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                    AssertionConsumerServiceURL="https://sp-saml.my.salesforce.com?so=00D2v0000012rOU"
                    Destination="https://issuer.com/saml/"
                    ID="_2CAAAAWurCXQMME8wMnYwMDAwMDA4T0k1AAAA2uZdjJowCaogMhVR698OWjozA-yYTZwj7ShPT6EfHaJgIY7pApTbs6XVGMp9sXwqgDL-dHeNiVxW3xvFCI9ehYuw3NuUqPMyGPvxHD_M264Ox70z0qtoCombnnCYClvAj7Rg1F-jEbQEQyG-wwW_WZ677-UngSHvsctoAwBOkWV-WlPGNxCERjotap58UQ7_8A51Yvb45mcRrlIkMZbVU3KVgkwbzFGSxB-ESZ1s-g0gGP43sJe-RMatD3ER1U_Prw"
                    IssueInstant="2019-06-03T00:57:32.385Z"
                    ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                    Version="2.0"
                    >
    <!--SAML - Request > 【Issuer】-->
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://sp-saml.my.salesforce.com</saml:Issuer>
    <!--SAML - Request > 【Signature】-->
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
            <ds:Reference URI="#_2CAAAAWurCXQMME8wMnYwMDAwMDA4T0k1AAAA2uZdjJowCaogMhVR698OWjozA-yYTZwj7ShPT6EfHaJgIY7pApTbs6XVGMp9sXwqgDL-dHeNiVxW3xvFCI9ehYuw3NuUqPMyGPvxHD_M264Ox70z0qtoCombnnCYClvAj7Rg1F-jEbQEQyG-wwW_WZ677-UngSHvsctoAwBOkWV-WlPGNxCERjotap58UQ7_8A51Yvb45mcRrlIkMZbVU3KVgkwbzFGSxB-ESZ1s-g0gGP43sJe-RMatD3ER1U_Prw">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"
                                                PrefixList="ds saml samlp"
                                                />
                    </ds:Transform>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <ds:DigestValue>xxxx=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>xxxx==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>...</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
</samlp:AuthnRequest>

                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <ds:DigestValue>xxxx=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>xxxx==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>...</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
</samlp:AuthnRequest>
```
#### 2. IdPへのリダイレクト
リソースへのアクセス要求(HTTP Request)に対して、SPはユーザーをIdPにリダイレクトさせます。
今回のケースでは、リソースへのアクセス要求(HTTP Request)に対して
・(1)(SP) SAMLRequest生成用のエンドポイントにパラメータを付与してリダイレクト
・(2)(SP) SAMLRequestをBase64でエンコードしてHTMLformに埋め込んでAuthnResponseとして返す
・(3)(ブラウザ) HTMLformで指定されたアクションを実行してRelayStateとSAMLRequest(=AuthnRequest)を送信する
といった手順を踏むことで、最終的にIdPへのリダイレクトを実現します。

上記のRelayStateには、ログイン後に参照したいURLを記載するケースが多いです。

```logs:(1)HTTPRequest-パラメータ
Issuer: https://sp-saml.my.salesforce.com
RelayState: https://sp-saml.my.salesforce.com/lightning/setup/EnableLightningExperience/home
saml_binding_type: HttpPost
```
```html:(2)HTTPResponse
<body onload="ducument.forms[0].submit()">
　<form action="https://idp.com/saml/sso/login" method="post">
　　<div>
　　　<input type="hidden" name="RelayState" value="https://sp-saml.my.salesforce.com/lightning/setup/EnableLightningExperience/home">
　　　<input type="hidden" name="SAMLRequest" value="...">
　　</div> 
　　<noscript>
　　　<div>
　　　　<input type="submit" value="continue/">
　　　</div>
　　</noscript>
　　...
```
#### 3.認証情報の要求
IdPのログインURLへのリクエストに対して、IdPはユーザーに対して認証情報の要求画面を表示します。
#### 4.認証情報の入力
ユーザーは要求画面に、認証情報(ex.ID / Password)を入力してIdPに送信します。
#### 5+6.AuthnResponseの送信+SPへのリダイレクト
IdP側はAuthnRequestの中身と入力情報の検証を行い、IdPは認証要求のリクエストに対する返答(AuthnResponse)を発行します。

```xml:AuthnResponse
<!--SAML - 【Response】-->
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                Destination="https://sp-test.my.salesforce.com?so=00D2v0000012rOU"
                ID="FIMRSP_1ad8a092-016b-171f-a552-839c4029e276"
                InResponseTo="_2CAAAAWurCXQMME8wMnYwMDAwMDA4T0k1AAAA2uZdjJowCaogMhVR698OWjozA-yYTZwj7ShPT6EfHaJgIY7pApTbs6XVGMp9sXwqgDL-dHeNiVxW3xvFCI9ehYuw3NuUqPMyGPvxHD_M264Ox70z0qtoCombnnCYClvAj7Rg1F-jEbQEQyG-wwW_WZ677-UngSHvsctoAwBOkWV-WlPGNxCERjotap58UQ7_8A51Yvb45mcRrlIkMZbVU3KVgkwbzFGSxB-ESZ1s-g0gGP43sJe-RMatD3ER1U_Prw"
                IssueInstant="2019-06-03T00:58:52Z"
                Version="2.0"
                xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
                >
    <!--SAML - Response > 【Issuer】-->
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://idp.com/saml/sps/saml20ip/saml20</saml:Issuer>
    <!--SAML - Response > 【Signature】-->
    <ds:Signature Id="uuid1ad8a093-016b-1832-86cc-839c4029e276">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
            <ds:Reference URI="#FIMRSP_1ad8a092-016b-171f-a552-839c4029e276">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
                <ds:DigestValue>...</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>...==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>...==</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
    <!--SAML - Response > 【Status】-->
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
    </samlp:Status>
    <!--SAML - Response > 【Assertion】-->
    <saml:Assertion ID="Assertion-uuid1ad8a08a-016b-10e9-9614-839c4029e276"
                    IssueInstant="2019-06-03T00:58:52Z"
                    Version="2.0"
                    >
        <!--SAML - Response > Assertion > Issuer-->
        <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://idp.com/saml/sso/issue</saml:Issuer>
        <!--SAML - Response > Assertion >【Signature】-->
        <ds:Signature Id="uuid1ad8a08b-016b-11fc-a044-839c4029e276">
            <ds:SignedInfo>
                <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
                <ds:Reference URI="#Assertion-uuid1ad8a08a-016b-10e9-9614-839c4029e276">
                    <ds:Transforms>
                        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    </ds:Transforms>
                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
                    <ds:DigestValue>...</ds:DigestValue>
                </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>...==</ds:SignatureValue>
            <ds:KeyInfo>
                <ds:X509Data>
                    <ds:X509Certificate>...==</ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </ds:Signature>
        <!--SAML - Response > Assertion > 【Subject】-->
        <saml:Subject>
            <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@gmail.com</saml:NameID>
            <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
                <saml:SubjectConfirmationData InResponseTo="_2CAAAAWurCXQMME8wMnYwMDAwMDA4T0k1AAAA2uZdjJowCaogMhVR698OWjozA-yYTZwj7ShPT6EfHaJgIY7pApTbs6XVGMp9sXwqgDL-dHeNiVxW3xvFCI9ehYuw3NuUqPMyGPvxHD_M264Ox70z0qtoCombnnCYClvAj7Rg1F-jEbQEQyG-wwW_WZ677-UngSHvsctoAwBOkWV-WlPGNxCERjotap58UQ7_8A51Yvb45mcRrlIkMZbVU3KVgkwbzFGSxB-ESZ1s-g0gGP43sJe-RMatD3ER1U_Prw"
                                              NotOnOrAfter="2019-06-03T00:59:52Z"
                                              Recipient="https://sp-test.my.salesforce.com?so=00D2v0000012rOU"
                                              />
            </saml:SubjectConfirmation>
        </saml:Subject>
        <!--SAML - Response > Assertion > 【Conditions】-->
        <saml:Conditions NotBefore="2019-06-03T00:57:52Z"
                         NotOnOrAfter="2019-06-03T00:59:52Z"
                         >
            <saml:AudienceRestriction>
                <saml:Audience>https://sp-test.my.salesforce.com</saml:Audience>
            </saml:AudienceRestriction>
        </saml:Conditions>
        <!-- SAML - Response > Assertion > 【Statement】-->
        <saml:AuthnStatement AuthnInstant="2019-06-03T00:58:52Z"
                             SessionIndex="uuid1ad76845-016b-1bf3-a323-839c4029e276"
                             SessionNotOnOrAfter="2019-06-03T01:58:52Z"
                             >
            <saml:AuthnContext>
             <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
            </saml:AuthnContext>
        </saml:AuthnStatement>
    </saml:Assertion>
</samlp:Response>
```

また、ユーザーからの認証情報の送信(HTTP Request)に対して、レスポンス内にSAMLResponse(=AuthnResponse)を埋め込んだHTMLformをブラウザに返します。

```html:HTTPResponse
<body>
　<form action="https://sp-test.my.salesforce.com?so=00D2v0000012rOU" method="post">
　　<div>
　　　<input type="hidden" name="RelayState" value="https://sp-saml.my.salesforce.com/lightning/setup/EnableLightningExperience/home">
　　　<input type="hidden" name="SAMLResponse" value="...">
　　</div> 
　　...
```
HTMLformで指定されたアクションを実行してRelayStateとSAMLResponse(実態はAuthnResponse)を指定されたSP側のURLに送信します。

#### 7.リソースの提供
SPはユーザーが要求するリソースにアクセスできる権限があるかチェックを行います。
権限が存在することを検証し、resourceはブラウザに返されます。

## 終わりに
SAMLに関しては、理解する必要がある情報が多いにも関わらず、日本語のドキュメントは豊富ではありません。
より詳細な部分はOASISのpdfなどを見て調べることになるかと思いますが、その前段の「SAMLに対するざっくりとした理解」の助けになれば幸いです。

## 参考リンク集
https://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf
https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf
https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
https://www.oasis-open.org/committees/download.php/27819/sstc-saml-tech-overview-2.0-cd-02.pdf
https://www.nttdata-strategy.com/medit/pdf/240423/7-data.pdf
https://blog.cybozu.io/entry/4224