はじめに
今回「SSOをしたい」という話になり、案としてSAMLか、IdPを使ったOIDCが出てきました。ただ、それぞれ何なのか、何が違うのか、正直ちゃんと説明できるほど理解していなかったので、理解を深めるために整理してみます。
そもそもSSOとは
SSO(Single Sign-On)は、一度のログインで複数のサービスを利用できるようにする仕組みです。
IdPとサービス側
登場人物だけ押さえておきます。
・IdP(Identity Provider)
「このユーザーが誰なのか」を確認する側。OIDCでは正式にはOP(OpenID Provider)と呼びますが、この記事では分かりやすさのためIdPと表現します。
・サービス側
IdPから認証結果を受け取り、ユーザーにサービスを提供する側です。SAMLとOIDCでは呼び方が異なります。
- SAML → SP(Service Provider)
- OIDC → RP(Relying Party)
SAMLとは
SAML(Security Assertion Markup Language)は、異なるシステム間で認証結果などをやり取りするための標準規格です。
SSOでは次のような流れになります。
ユーザー
⇩
サービス(SP)
⇩
IdPへリダイレクト
⇩
ログイン
⇩
SAML Response
⇩
サービス(SP)
ここでは次くらいまで押さえておけば十分です。
- XMLベース
- SAML Response / SAML Assertionを利用する
- 企業向けSSOなどで広く利用されている
SAMLでは、SAML Assertionで「誰がログインしたのか」をサービス側(SP)に伝えます。XMLの中身や署名検証には深入りしません。
OIDCとは
OIDC(OpenID Connect)は、OAuth 2.0をベースにした認証の仕組みです。流れはSAMLと同じになります。
ユーザー
⇩
サービス(RP)
⇩
IdPへリダイレクト
⇩
ログイン
⇩
ID Token
⇩
サービス(RP)
SAMLではSAML Assertion、OIDCではID Tokenを使って「誰がログインしたのか」を伝えます。
ここでOAuth 2.0に少しだけ触れます。OAuth 2.0は主に「認可」のための仕組みです。OIDCはOAuth 2.0をベースに、ユーザーを認証する仕組みを追加したものです。
OIDCでは、認証されたユーザーの情報をID Tokenを使ってサービス側(RP)に伝えます。
SAMLとOIDCの違い
ここまで見ると、SAMLとOIDCは使うデータ形式やプロトコルは異なりますが、「IdPで認証し、その結果をサービス側に伝える」という大きな考え方は似ています。
主な用途
- SAML:認証・SSO
- OIDC:認証・SSO
認証する側
- SAML:IdP
- OIDC:OP
サービス側
- SAML:SP
- OIDC:RP
認証結果を伝えるもの
- SAML:SAML Assertion
- OIDC:ID Token
データ形式
- SAML:XML(SAML Assertion)
- OIDC:JWT(ID Token)
ベース
- SAML:SAML独自の仕様
- OIDC:OAuth 2.0
よく利用される場面
- SAML:企業・社内システムなど
- OIDC:Web・SPA・モバイルなど
「SAMLは古いからOIDCに置き換えればいい」という単純な話ではなく、連携するサービスやIdPが何に対応しているかによって選択する、というイメージです。
まとめ
- SSOは、一度のログインで複数サービスを利用できる仕組み
- SAMLは、XMLベースで認証結果などをやり取りする仕組み
- OIDCは、OAuth 2.0をベースにした認証の仕組み
- SAML / OIDCは、SSOを実現するために利用できる代表的な仕組み
SAML / OIDC / SSOという言葉は一緒に登場することが多いですが、SSOは「実現したいこと」、SAMLやOIDCは「それを実現するために利用できる仕組み」と整理すると理解しやすいです。