やさしい言葉で理解するSAML認証のまとめ

## はじめに


この記事は認証についてチンプンカンプンのWEBプログラマー2年生が、
SAML認証について調べたことをなるべく易しくかみ砕いた言葉でまとめたものです。

- SAML認証って初めて聞いたんですけど一体何なんですか？
- SAML認証について調べようとしたら知らないカタカナばっかりでてきて意味わかんないむかつく

という方向けの記事です。


## SAMLってなんなの？
###SAMLってどういう意味？
SAMLはSecurity Assertion Markup Languageの略。

直訳すると、"安全な表明マークアップ言語"、となるのですが、このままでは意味不明ですね。
意訳すると、"ユーザの認証情報をXML形式で記述したもの"という意味になります。

SAMLは"OASIS"というコンピュータと通信に関する取り決めをする団体が策定しました。
現在の最新版となるSAML2.0は、2005年3月に発行されたものです。

### Assertionってなんだ？
AssertionというのはSAML独自の概念になります。
これを直訳すると"表明"とか"主張"とかいう言葉になるのですが、その実際は**受け渡しをする認証情報のこと**になります。

###SAMLは何に使うの？
SAMLはおもに**SSO（シングル・サイン・オン）の仕組みのひとつ**として利用されています。
SSOとは、1組のIDとパスワードで認証を行うことで、複数のサービスにログインできる仕組みです。
SSOを利用することにより、ユーザはサービスごとにいちいち認証を行うという手間を省くことができる、というメリットがあります。


## SAML認証のながれ

では、SAML認証はどのような流れで行われるのでしょうか？

### 最低限おぼえる用語2つ
SAMLを理解するために、次の2つの言葉を知っておいてください。

- **SP（Service Provider）**
WEBサービスの提供側、認証情報を利用する側のこと。
この人アクセスしたがっているから認証してあげてね、とお願いする側です。

- **Idp（Identity Provider）**
認証情報を提供する側のこと。
この人ログインできたからサービス利用させて大丈夫だよ、ちなみにこんな情報持っている人だよ、と教えてあげる側です。

### SAML認証には2種類のパターンがある
SAML認証には次の2つの認証の流れがあります。

**1. SP-initiated SAML**
**2. IdP-initiated SAML**

順番に確認していきます。


####1. SP-initiated SAML のながれ

SP-initiated SAML、つまり、SPから流れがはじまるSAMLです。
認証は下記の順番で行われます。

1. ユーザーがSPにアクセス
2. SPは 認証要求< AuthnRequest > を作成し、ユーザーをIdPにリダイレクトする
3. IdPは認証情報をユーザーにリクエスト
4. ユーザーがログインする
5. IdPは秘密鍵で電子署名した 認証応答< Response > を作る
6. ユーザーは 認証応答< Response > をSPにPOSTする
7. SPは 認証応答< Response > をIdpの公開鍵で検証する
8. ユーザーはSPのWEBサイトにアクセスできる

**認証要求**とはその名の通り、**ユーザを認証してくださいというメッセージ**です。
そして**認証応答**は、**その要求に対するお返事**です。
これらのメッセージがXML形式で記述されています。


####2. IdP-initiated SAML のながれ

IdP-initiated SAMLは、IdPから流れがはじまるSAMLです。
認証は下記の順番で行われます。

1. IdPは認証情報をユーザーにリクエスト
2. ユーザーがログインする
3. IdPは秘密鍵で電子署名した 認証応答< Response > を作る
4. ユーザーは 認証応答< Response > をSPにPOSTする
5. SPは 認証応答< Response > をIdpの公開鍵で検証する
6. ユーザーはSPのWEBサイトにアクセスできる


いずれにしても、SAML認証ではSPとIdPの間で、信頼関係をつくっておく必要があります。
信頼関係とは、具体的には事前に公開鍵を交換し合うということです。


## OpenIDとSAMLの違いから見るSAMLに向いているサービス

では、なぜSSOにSAML認証を使うのでしょうか。
SSOの仕様としてメジャーなOpenIDと対比してみます。

なお、ここではOpenIDとは何かについての詳細と認証の流れについては割愛します。

###OpenIDとSAMLの違い1
**OpenIDの場合**
どんなサービスでも認証情報の提供側、認証情報の利用側になることができる。

**SAMLの場合**
事前の公開鍵の交換、デフォルト設定などを行う必要がある。

**⇒ OpenIDとくらべてSAMLの方が連携するための敷居が高い。**

###OpenIDとSAMLの違い2
**OpenIDの場合**
連携するかどうかはユーザ自身で選択する。

**SAMLの場合**
連携するかどうかはユーザに同意確認しない。

**⇒ SAMLではそもそも連携するかどうかユーザの選択権がない。**

###OpenIDとSAMLの違い3
**OpenIDの場合**
ログイン時に利用する認証情報の提供サービスをユーザ自身が選べる。

**SAMLの場合**
ログイン時に利用する認証情報の提供サービスをユーザで選ぶことはできない。

**⇒ SAMLではユーザが実際にログイン情報を渡すサービスを選べない。**

###SAMLはどんなサービスに向いているのか
SAML認証には強制力があるため **"すべてのユーザに利用させたい" 場合に向いている**といえます。
そのため企業や団体など組織単位で利用するサービスに使われるケースが多いようです。

逆に、ユーザの自由度が求められる一般のサービスには向いていません。


## まとめ

SAML認証について調べると、その難解さに萎えてしまったのですが、原因は用語の意味が分からないことでした。

実際の流れを知るには、別の何かに例えるよりも一つひとつの用語の意味を知ることのほうが理解の助けになると感じたため、なるべく易しい言葉でのまとめを作成しました。

##参考
- [SAML Wiki](https://wiki.oasis-open.org/security/FrontPage)
- [SAML認証を勉強せずに理解したい私から勉強せずに理解したい私へ - Qiita](https://qiita.com/khsk/items/10a136bded197272094a)
- [今更ですがSAMLのおさらい - Qiita](https://qiita.com/SAM-l/items/a144a8661635fcc9fb0e)
- [オッス！オラ認証周りをまとめてみた - どんまいこのネタ帳](http://mnakajima18.hatenablog.com/entry/2016/05/04/205713)
- [SAML認証に関する自分なりのまとめ - なんとな～くしあわせ？の日記](http://nantonaku-shiawase.hatenablog.com/entry/2016/07/13/081053)
- [SAML2.0サービスプロバイダーのメタデータ - Qiita](https://qiita.com/oTsogbadrakhChinzorig/items/c5210e548b6ff02281d2)
- [SAML認証ができるまで - Cybozu Inside Out | サイボウズエンジニアのブログ](https://blog.cybozu.io/entry/4224)