SSO — 1枚のゴールドカードで、街中のVIPルームへ
会社で使うサービスが増えるたびに、パスワードも1つずつ増えていく。その悩みを解くのが SSO(シングルサインオン)です。一度ログインするだけで、勤怠もチャットも経費精算も使えるようになります。
たとえるなら1枚のゴールドカードです。街の入口にあるカード発行所(IdP)で一度だけ本人確認を受ければ、あとは街中のVIPルームで、そのカードを見せて通行証をもらうだけ。図1で「SSOなし」と「SSOあり」を切り替えて、3つの部屋に入ってみてください。
部屋はパスワードを知らない。通行証を確かめるだけ
SSOありで部屋に入ると、部屋は自分でパスワードを聞かずに「カード発行所で通行証をもらってきて」とあなたを送り出します(リダイレクト)。IdPで本人確認が済むと、IdPの署名入りの通行証を持って部屋に戻ります。部屋は事前に登録しておいたIdPの公開鍵で署名を確かめ、本物なら入れます。
2つ目の部屋では、パスワードを聞かれませんでした。IdPが「この人はさっき確認済み」というログイン状態(ゴールドカード)を覚えているので、顔パスで新しい通行証を発行できるからです。パスワードは最初の1回、しかもIdPにしか見せていません。
「退職したことにする」も試してみてください。SSOなしでは部屋ごとに止める必要があり、1つでも止め忘れると入れてしまいます。SSOありならIdPで1か所止めるだけで、どの部屋でも通行証がもらえなくなります。
SAMLとOIDC — 通行証の「書式」が違う
SSOを実現する代表的な方式が SAML と OIDC(OpenID Connect)です。流れはどちらも図1と同じで、違うのは通行証の書式です。SAMLはXMLで書いた「アサーション」、OIDCはJWTで書いた「IDトークン」を使います。OIDCはOAuth 2.0の上に「本人確認」を足したものです。
書式は違っても、書いてある中身はほぼ同じです。図2で項目を押して、両方の書式のどこに書かれているかを見比べてください。
<saml:Assertion> <saml:Issuer>https://idp.example.com</saml:Issuer> <ds:Signature>…IdPの署名…</ds:Signature> <saml:Subject> <saml:NameID>hanako@example.com</saml:NameID> </saml:Subject> <saml:Conditions NotOnOrAfter="2026-09-28T10:05:00Z"> <saml:Audience>https://kintai.example.com</saml:Audience> </saml:Conditions> </saml:Assertion>
{ "iss": "https://idp.example.com", "sub": "hanako@example.com", "aud": "chat-app", "exp": 1790590200, "iat": 1790589900 } + 署名(JWTの3つ目のパーツ)
カードが1枚だからこそ、守りを固める
便利な反面、ゴールドカード(IdPのログイン)を盗まれると、全部の部屋に入られてしまいます。そのためSSOは、IdPでの多要素認証(MFA)とセットで使うのが基本です。守るべき扉が1つにまとまるので、その1枚を集中して固めればよい、と考えることもできます。
- SSO
- 一度のログインで、複数のサービスを使えるようにする仕組み。
- IdP
- Identity Provider。本人確認をして通行証を発行する側。Microsoft Entra ID、Okta、Google など。
- SP / RP
- 通行証を受け取ってログインさせる側のサービス。SAMLではSP、OIDCではRPと呼ぶ。
- SAML
- XMLのアサーションで本人確認の結果を伝える方式。企業向けSaaSで広く使われる。
- OIDC
- OAuth 2.0 の上に本人確認を足した方式。JWTのIDトークンを使う。
- MFA
- パスワードに加えて、スマホの通知や生体認証など別の要素でも本人を確かめること。
まとめ
SSOは、本人確認をカード発行所(IdP)の1か所に集める仕組みです。各サービスはパスワードを持たず、IdPが署名した通行証を確かめるだけ。IdPがログイン状態を覚えているので、2つ目以降のサービスはパスワードなしで入れます。SAMLとOIDCは通行証の書式の違いで、書いてある中身はほぼ同じです。