ソーシャルログイン

ソーシャルログインのOAuth 2.0とOpenID Connectの違い

ソーシャルログインでは、OAuth 2.0は「利用者の情報へのアクセスを許可する」ための規格、その上に作られたOpenID Connectは「ログインしているのは誰かを伝える」ための規格で、ログインの根拠にはOpenID ConnectのIDトークンを使います。自社サイトは利用者のパスワードを受け取らず、SNSが署名したIDトークンを検証して本人を確認します。本記事では、2つの規格の違い、認可コードフローとPKCE、実装で必ず検証する項目を、担当者にも分かる言葉で説明します。

OAuth 2.0は、利用者の情報へのアクセスを自社サイトに「許可する」ための規格です。ログインに必要な「いま操作しているのは誰か」を伝えるのは、その上に作られたOpenID Connectです。

ログインに使うのはOpenID Connect。OAuth 2.0だけでは足りない

ソーシャルログインの基本はソーシャルログインとはで、会員登録が終わるまでの全体の流れはソーシャルログインの仕組みで解説しています。

ログインの根拠にIDトークンを使うこと、認可コードフローとPKCEを使うこと、state・nonce・署名を必ず検証することの3点を並べた図。
実装で必ず守ること

実装で外せないのは次の点です。

  1. ログインの根拠にはIDトークンを使いましょう。アクセストークンは「情報を見てよい許可証」で、本人であることの証明にはなりません。
  2. 認可コードフローとPKCEを使いましょう。
  3. state・nonce・署名は必ず検証してください。検証を省くと、他人になりすましたログインを許す恐れがあります。

ソーシャルログイン・パスキーの導入をご検討中の方へ

LINE・Google・Apple・Yahoo! JAPAN・Facebook・X のログインとパスキーに、1つの実装で対応できます。対応SNS・料金・導入の流れを資料にまとめています。

登場する3者と、OAuth 2.0とOpenID Connectの違い

ソーシャルログインに登場するのは次の3者で、規格の文書ではそれぞれ独特の呼び名が使われます。

登場者

OAuth 2.0での呼び名

OpenID Connectでの呼び名

具体例

利用者

リソースオーナー

エンドユーザー

ログインしようとしている人

自社サイト

クライアント

リライングパーティ(RP)

会員サイト、ECサイト

SNS

認可サーバー

OpenIDプロバイダー(OP)

LINE、Googleなど

2つの規格は、目的が違います。

OAuth 2.0

OpenID Connect

目的

このサイトに、利用者の情報へのアクセスを許すか(認可)

いまログインしているのは誰か(認証)

受け取るもの

アクセストークン

IDトークン(+アクセストークン)

中身

自社サイトからは読めないことが多い、APIを呼ぶための鍵

発行元・利用者のID・宛先・有効期限などを書き、SNSが署名したもの

要求のしかた

取得したい情報をスコープで指定

スコープにopenidを必ず含める

規格

RFC 6749

OpenID Connect Core 1.0

アクセストークンをログインの根拠にしてはいけない理由

アクセストークンは「持っている者に情報を見せてよい」という許可証です。誰に宛てて発行されたかを自社サイトでは確かめにくいため、別のサイト向けのアクセストークンを持ち込まれても見分けられない場合があります。

一方、IDトークンには、宛先(aud)として自社サイトのクライアントIDが書かれ、SNSの署名が付いています。宛先と署名を確かめれば「自社サイトのために、このSNSが、この人を確認した」ことが分かる点が、アクセストークンとの違いです。

アクセストークンは宛先を確かめにくい許可証で、IDトークンは宛先(aud)とSNSの署名を確かめられるため、ログインの根拠にはIDトークンを使うことを比べた図。
アクセストークンとIDトークンの違い

ボタンを押してからログインが終わるまで(認可コードフロー)

ソーシャルログインで標準的に使われるのは認可コードフローで、自社サイト・ブラウザ・SNSの間で次のやり取りが起きます。

ログインボタンを押してから、SNSの認可画面での同意、認可コードとstateの受け取り、サーバー間でのトークン交換、IDトークンの検証と会員照合までを5段で示した流れ図。
認可コードフローの流れ
  1. 利用者がログインボタンを押すと、自社サイトはstate・nonce・code_verifierをランダムに作り、セッションに保存します。
  2. 利用者のブラウザを、URLにclient_id・redirect_uri・scope=openid …・state・nonce・code_challengeを付けてSNSの認可画面へ移動させます。
  3. 利用者はSNSにログインし、情報の提供に同意します。パスワードを入力するのはSNSの画面なので、自社サイトには届きません。
  4. SNSはブラウザをコールバックURLに戻し、短時間だけ有効な「認可コード」とstateを自社サイトに渡します。
  5. 届いたstateが手順1で保存した値と一致するかを、自社サイトで確かめます。
  6. 自社サイトのサーバーからSNSへ直接、認可コードとcode_verifier、クライアントの認証情報を送り、IDトークンとアクセストークンを受け取ります。
  7. IDトークンを検証し、中のsub(利用者のID)で会員を探します。見つからなければ新しく作ります。

トークンが受け渡されるのは手順6だけで、手順6はブラウザを通らないサーバー同士の通信です。ブラウザを通るのは、すぐに期限が切れて1回しか使えない認可コードだけです。

かつて使われた「インプリシットフロー」のように、アクセストークンを認可レスポンスでブラウザのURLに載せて返す方式は、OAuth 2.0のセキュリティのベストプラクティス(RFC 9700)で使うべきでないとされています。

PKCEで認可コードを盗まれても使えなくする

PKCE(ピクシー、RFC 7636)は、認可コードの横取りを防ぐ仕組みです。

code_verifierを作って保存し、変換したcode_challengeを送り、トークン交換時に元の値を送ってSNSが一致を確かめるPKCEの3段の流れ図。
PKCEで認可コードを守る流れ
  • 自社サイトは、43〜128文字のランダムな文字列(code_verifier)を作り、手元に保存する
  • それをSHA-256で変換した値(code_challenge)だけを、最初の認可リクエストで送る(方式はS256)
  • トークンを受け取るときに元のcode_verifierを送り、SNSは変換結果が最初の値と一致するかを確かめる

途中で認可コードを盗んだ者はcode_verifierを知らないため、トークンに交換できません。PKCEはもともとスマートフォンアプリ向けに作られましたが、RFC 9700では、クライアントシークレットを安全に保管できないアプリには必須、サーバーで動くWebサイトにも推奨とされています。

IDトークンの中身と、確かめる項目

IDトークンはJWT(JSON Web Token)という形式の文字列で、ヘッダー・中身・署名がピリオドでつながっています。中身には、次のような項目(クレーム)が入っています。

IDトークンでは署名、発行元・宛先・期限などのクレーム、nonceを確かめ、会員の照合にはメールアドレスでなくsubを使うことを示した図。
IDトークンで確かめること

クレーム

意味

確かめること

iss

発行元

想定しているSNSの値と完全に一致するか

sub

利用者のID

会員の照合に使う。発行元の中で一意で、別の人に使い回されない

aud

宛先

自社サイトのクライアントIDが含まれているか

exp

有効期限

期限が過ぎていないか

iat

発行時刻

極端に古くないか

nonce

認可リクエストで送った値

手順1で保存した値と一致するか

あわせて、SNSが公開している鍵やクライアントシークレットを使って、署名が正しいかどうかも確かめる必要があります。LINEのように、検証用のAPIを用意しているSNSもあります。

会員の照合にはsubを使ってください。メールアドレスは利用者が変更でき、SNSによっては転送用のアドレスが渡されるため、照合には向きません(Appleでサインインの注意点)。

スコープの指定と、プロフィール情報の受け取り方

OAuth 2.0では、受け取りたい情報の範囲を「スコープ」で指定し、SNSの同意画面にはその範囲が表示されます。OpenID Connectではスコープにopenidを必ず含め、そのうえで必要な分だけ標準のスコープを足すのが一般的です。

スコープにopenidを含め、必要に応じてprofileやemailを足し、IDトークンに無い項目はUserInfoエンドポイントで取得し、subの一致を確かめてから使う流れを示した図。
スコープ指定から情報の受け取りまで
  • profileを足すと、名前やプロフィール画像などを受け取れる
  • emailを足すと、メールアドレスと、それが確認済みかどうかを受け取れる

使えるスコープの名前や受け取れる項目はSNSごとに違うので、各SNSの開発者向け文書で確認してください。

名前やメールアドレスがIDトークンに入っていない場合は、一緒に受け取ったアクセストークンでSNSのUserInfoエンドポイントを呼び出して取得します。UserInfoの応答にもsubが入っているので、IDトークンのsubと一致することを確かめてから使いましょう。

stateとnonceの違い

stateとnonceは、どちらもランダムな値を送って戻ってきた値と比べる仕組みなので混同されがちですが、防ぐ攻撃が異なります。

state

nonce

規格

OAuth 2.0

OpenID Connect

戻ってくる場所

コールバックURLのパラメータ

IDトークンの中

防ぐもの

CSRF(他人が始めたログインの結果を、利用者のブラウザに送り込む攻撃)

リプレイ(以前に発行されたIDトークンの使い回し)

比べるタイミング

認可コードを受け取った直後

IDトークンを検証するとき

stateとnonceはログインのたびに新しく作り、利用者のセッションに結びつけて保存してください。固定の値や推測できる値を使うと、攻撃を防げません。

よくある実装ミスとセキュリティ上の注意

ミス

起きること

正しい実装

stateを送るだけで比べていない

攻撃者のSNSアカウントで、利用者をログインさせられる

保存した値と一致しなければ処理を止める

IDトークンの中身をデコードするだけで、署名やaudを確かめない

偽造や、別のサイト向けのトークンを受け入れる

署名・iss・aud・exp・nonceをすべて検証する

ブラウザやアプリから利用者IDだけをサーバーに送る

IDを書き換えるだけで他人になりすませる

サーバーはトークンを受け取り、自分で検証する

メールアドレスが一致したら既存会員に自動で統合

他人の会員情報にログインされる恐れ

ログイン中の本人にだけ連携を追加する(アカウント統合の設計)

クライアントシークレットをブラウザ側のコードに書く

第三者に読まれ、自社サイトになりすまされる

シークレットはサーバーだけで扱う

コールバックURLを広く許可する

認可コードを別のURLへ送らせる攻撃の余地が生まれる

完全一致で、必要なURLだけを登録する

必要以上のスコープを要求する

同意画面での離脱が増え、保管する情報も増える

使う情報だけを要求する

SNSアカウントの乗っ取りなど、実装以外のリスクと対策はソーシャルログインの危険性と対策で、LINEを例にした具体的な設定の流れはLINEログインの実装手順で解説しています。

よくある質問

ソーシャルログインで、自社サイトは利用者のパスワードを受け取りますか?

受け取りません。パスワードはSNSの画面で入力され、自社サイトに届くのは認可コードとトークンだけです。

「OAuth認証」という呼び方は正しいですか?

よく使われる呼び方ですが、OAuth 2.0そのものは認可のための規格で、利用者が誰かを確かめる手順は定めていません。ソーシャルログインで「OAuth」と呼ばれているものの多くは、実際にはOpenID Connectか、OAuth 2.0にSNS独自の方法で本人確認を足したものです。

OAuth 2.0に対応していれば、ソーシャルログインに使えますか?

ログインに使うなら、OpenID Connectに対応しているかを確認してください。OAuth 2.0だけの場合は、アクセストークンでプロフィールを取得して利用者を特定することになり、宛先の確認などを自社で補う必要があります。

PKCEを使えばstateは不要ですか?

RFC 9700では、PKCE・OpenID Connectのnonce・stateのいずれかでCSRFを防ぐことが求められ、PKCEはその手段の1つとされています。ただ、stateを必須にしているSNSもあるので、両方を使っておくのが確実です。

IDトークンとアクセストークンは保存しておくべきですか?

ログインの確認が終われば、IDトークンを保存しておく必要は通常ありません。ログイン後もSNSのAPIを呼ぶ場合だけ、アクセストークンをサーバー側で安全に保管してください。

Login Plus について

Login Plus のログイン画面。6つのソーシャルログインとパスキーに対応
Login Plus のログイン画面。6つのソーシャルログインとパスキーに対応

Login Plusは、6つのソーシャルログイン(Apple・Facebook・Google・X(旧Twitter)・Yahoo! JAPAN・LINE)とパスキーに、1つの実装で対応できるサービスです。SNSごとに異なる認可リクエストやトークンの扱いを個別に実装する代わりに、Login Plusとの連携を1つ実装し、ログイン後の利用者情報はuserinfo APIで受け取ります。

  • 各SNSの仕様変更にはLogin Plus側で対応
  • 各SNSへの申請手順書を、契約企業に無償で提供
  • FIDO2 / WebAuthnに基づくパスキーにも対応
  • 管理画面で、利用ID数・ログイン数・利用SNSの内訳を確認

自社のシステムにどう組み込むか、技術的なご相談は、資料請求またはお問い合わせからどうぞ。

ソーシャルログイン・パスキーの資料をお送りします

対応SNS・料金・実装の流れ・導入事例をまとめています。
「自社に導入できるか」のご相談も、同じフォームから承ります。

送信をもって個人情報の取り扱いに同意いただいたものとみなします。

個別のご相談は からもどうぞ。

送信をもって個人情報の取り扱いに同意いただいたものとみなします。

送信をもって個人情報の取り扱いに同意いただいたものとみなします。