今更ですがSAMLのおさらい

#今更ですがSAMLのおさらい

私がSAMLと出会ったのは、2007年のことでした。
初任務がID-WSFの実装で、その際SAMLを学びましたです。

ということで、久しぶりにSAMLのおさらいでもしてみようと思います。

##SAML 2.0 とは

###SAML 2.0
SAML は Security Assertion Markup Language の略称。
[OASIS](https://www.oasis-open.org/)（Organization for the Advancement of Structured Information Standards）によって策定された XML をベースにしたIdentity Management の標準規格。 
さむる、さみゅえる、などと発音します。

![SAML.png](https://qiita-image-store.s3.amazonaws.com/0/246440/4f6e41e1-88a4-cb0b-5498-55da0a62149a.png)

同様の技術として既に存在していた、 Securant Technologies社の[AuthXML](http://xml.coverpages.org/authxml.html)と、Netegrity社の[S2ML](http://xml.coverpages.org/s2ml.html)という２つの規格を統合したものがSAMLです。
2002年11月に SAML 1.0 が OASIS 標準となり、2003年9月に v1.1 が発行され、2005 年3月に v2.0 （最新版）が発行されています。

v2.0 仕様たちは下記。

>OASIS SAML Wiki
>https://wiki.oasis-open.org/security/FrontPage

###でも、"SAML is dead." って言われてる･･･よね？

SAMLはSSOだけでなく色々なことができるため仕様も複雑です。事前に信頼関係を築いたトラストサークル内のみでしか利用できないという制約もあります。XMLベースで実装もめんどくさいです。比較して、OpenID （当初は OpenID Authentication 2.0）は事前の信頼関係なく利用できたこともあり主にConsumer向けサービスでの利用が広まった結果 **"SAML is dead"** と言われてたりしているのかもしれないですが、実際のところまだ割と使われているのではないでしょうか。

印象としては

- Enterprise向け → SAML
- Consumer向け → OpenID

SAMLもまだまだ良く見かけます。

###SAML 2.0 の各仕様

SAMLはSSOだけでなく色々なことができる、とっても複雑なので仕様がいくつかに分かれています。
が、重要なのは下記４つです。

- [Core](http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)
    - やり取りするRequest/Response電文の仕様
- [Bindings](http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf)
    - 電文をやり取りする際の、通信方法の仕様
- [Profiles](http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf)
    - どのようなシナリオで利用されるかの仕様
- [Metadata](http://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf)
    - メタデータ（設定ファイル）についての仕様

個々の詳しい内容は別途にして、ここでは割愛します。

##OpenID Authentication 2.0 / OpenID Connect との違い？
SSOの仕様として、メジャーなもののうちに、OpenID がありますね。
OpenID も [Authentication 2.0](https://openid.net/specs/openid-authentication-2_0.html)、そして [OpenID Connect](http://openid.net/specs/openid-connect-core-1_0.html)とありますがどう違うのでしょうか:question:

###OpenID Authentication 2.0
OpenID [Authentication 2.0](https://openid.net/specs/openid-authentication-2_0.html)は2007年12月に策定された、**現在はOpenID Conectによって置き換えられている**仕様です。

[Authentication 2.0](https://openid.net/specs/openid-authentication-2_0.html)には認証情報のやりとりしか定義されていないため、[Attribute Exchange 1.0](http://openid.net/specs/openid-attribute-exchange-1_0.html) (AX) と組み合わせてユーザの属性情報交換を実現していました。

![OpenID.png](https://qiita-image-store.s3.amazonaws.com/0/246440/1088295f-af4c-a9b5-7e9e-f77112530907.png)

:small_red_triangle_down: **特徴**

- **認証連携/属性情報交換にあたって事前登録や事前の情報交換不要**
    - どんなサービスでもOpenID Providerになれる
    - OP は どんなRelying Partyからの認証要求も受け入れる
- 連携する/しないはユーザ自身が判断
    - 同意確認がある
- ログイン時に利用するOPをユーザ自身が選ぶことができる
    - Googleでログイン
    - Twitterでログイン
    - 自作のOpenID Providerでログイン
    - などなど
- **OP→RPへの直接通信がシーケンス中に登場する**
    - 変なところに認証結果を飛ばしてしまわないよう返却先チェック

:small_red_triangle_down: **シーケンス例**
![OpenIDシーケンス.png](https://qiita-image-store.s3.amazonaws.com/0/246440/2226cf95-4232-4bd9-2f86-72f15698243a.png)
※認証についてのみ。
※でも、AX使って属性交換を行う場合も、シーケンスに代わりなく、AuthNResponseに属性情報が含まれます。

### SAML 2.0

SAML 2.0の概要は既に触れたとおりです。

![SAML.png](https://qiita-image-store.s3.amazonaws.com/0/246440/f584f99a-5b9a-79fe-baf3-1c36909847ad.png)

:small_red_triangle_down: **特徴**

- 認証連携/属性情報交換にあたってトラストサークルを形成する必要がある。
    - デフォルト設定や公開鍵の交換を行うことでトラストサークルを形成
- 連携する/しないは組織単位で判断され、ユーザの介入の余地はない
    - **ユーザの同意は確認しない**
- Web Browser SSO だけでなく様々なプロファイル（シナリオ）がある
- プロファイルだけでなく通信方式なども様々なものが定義されている
- **定義されているものやできることが沢山ありすぎる:bangbang:**
- 通信電文はXMLベース

:small_red_triangle_down: **シーケンス例** (Web Browser SSO Profile / Redirect Binding)
![SAMLシーケンス.png](https://qiita-image-store.s3.amazonaws.com/0/246440/134d987e-582a-7039-63e1-a455381e7acb.png)
※認証についてのみ。
※属性交換を行う方法は、AuthNResponseに含む方法、AttributeQueryでやる方法などいくつかあるため省略。

### OpenID Connect
[OpenID Connect](http://openid.net/connect/)も、多くの仕様群を有しますが、基本は[Core 1.0](http://openid.net/specs/openid-connect-core-1_0.html)のことを指します。
API認可の標準仕様 [OAuth 2.0 (RFC749)](https://tools.ietf.org/html/rfc6749) に 認証の要素を追加する目的で2014年2月に策定され、OpenID Authentication 2.0 を置き換えています。

![OIDC.png](https://qiita-image-store.s3.amazonaws.com/0/246440/9bc37aab-fb45-8a15-bad8-08d305e6933f.png)

:small_red_triangle_down: **特徴** 

- **認証と認可を端的にカバーする仕様**
- 連携にあたっては事前の情報交換が必要だが、自動的にそれを行うための仕様も存在する
    - [Discovery 1.0](http://openid.net/specs/openid-connect-discovery-1_0.html)
    - [Dynamic Client Registration 1.0](http://openid.net/specs/openid-connect-registration-1_0.html)
- 連携する/しないはユーザ自身が判断
    - 同意確認がある
- 通信電文はJSONベース

:small_red_triangle_down: **シーケンス例**
![OIDCシーケンス.png](https://qiita-image-store.s3.amazonaws.com/0/246440/79fc7f8a-2cc9-c08a-ffd6-f400b42a8979.png)
※認証についてのみ。
※属性交換は、id_tokenと同時に取得したaccess_tokenを使ってやります。省略してます。

##おわりに

SAML、結構忘れてること多いなーと、改めて:sweat_smile::sweat_smile:
OIDCもですけど・・・。
やっぱり、継続大事ですね。
勉強怠るべからず:bangbang:
自戒の念を込めて:woman_tone1::woman_tone1: