本ページはプロモーションが含まれています

IT全般

Web認証方式5種類の違いを比較|JWT・OAuthの使い分け

CATEGORY
REV.
DRAWN BY
TOM
SHEETS
9枚
JWT / OAuth(Web認証方式5種類の違い)

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

Web認証とは、WebサイトやWebアプリにアクセスしてきた相手が本人かどうかを、サーバーが確かめる仕組みです。

方式は大きく2つの世代に分かれます。リクエストのたびにIDとパスワードを送る古い方式(レガシー認証)と、一度の本人確認で発行したトークンを使い回す新しい方式(モダン認証)です。

Microsoft 365の管理画面で「基本認証は終了、先進認証へ移行」と告げられて、この記事にたどり着いた人もいるでしょう。その場合はレガシー認証とモダン認証の違いから読むと早いです。メール送信に使うSMTP AUTHの基本認証は、2026年12月末に既定で無効になる予定です。

Basic認証からOAuth 2.0、OpenID Connect、パスキーまで、仕組みの違いと使い分けを順に整理します。

この記事でわかること

  • Web認証の定義と、認証・認可の違い
  • Basic・Digest・セッション・JWT・OAuth・OIDC・SAML・パスキーの比較表(安全性の比較つき)
  • レガシー認証とモダン認証(先進認証)の違いと、Microsoftが基本認証を止めた理由
  • 用途別の選び方(判断フロー付き)と、仕組みを追える図解

Web認証とは?認証と認可の違い

Web認証とは、リクエストを送ってきた相手が誰なのかをサーバーが確認し、その結果を以降の通信に引き継ぐ仕組みです。

確認するのは「誰か」だけで、「何をしてよいか」は別の話になります。

この2つを混ぜたまま方式を比べると、OAuthが認証なのか認可なのかで必ず迷います。

先に用語を分けておきます。

認証(Authentication)と認可(Authorization)

認証は「あなたは誰ですか」を確かめる工程、認可は「その人に何を許すか」を決める工程です。

ログイン画面でIDとパスワードを入れるのが認証で、ログイン後に管理画面を開けるかどうかを決めるのが認可に当たります。

オフィスに例えると、受付で社員証を見せて本人だと確かめるのが認証、本人と分かった上で「あなたが入れるのは3階まで」と決めるのが認可です。

認証と認可は2段階で行われる(失敗したときの返事も違う)
1
ユーザー → サーバーリクエストを送る例:管理画面を開く
2
サーバー / 認証あなたは誰か、を確かめる社員証(IDとパスワード)を確認する。確認できなければ 401 を返す
3
サーバー / 認可その人に何を許すか、を決める入れる部屋(権限)を確認する。許可がなければ 403 を返す
4
サーバー → ユーザー処理を実行して結果を返す
NOTE認証に成功しても、認可で止まることがあります。401は「誰か分からない」、403は「誰かは分かったが許可がない」です。
項目認証認可
問い誰か何をしてよいか
具体例パスワード入力、指紋、パスキー管理者だけ記事を削除できる
失敗したときのHTTPステータス401 Unauthorized403 Forbidden
代表的な仕様Basic認証、OpenID Connect、WebAuthnOAuth 2.0

401と403の使い分けは、HTTPステータスコード一覧にまとめています。

OAuth 2.0が認可の仕様である点は、後の章で扱います。

認証の3要素と多要素認証(MFA)

本人確認の材料は、3種類に分けられます。

  • 知識:パスワード、PINコード、秘密の質問
  • 所持:スマートフォン、セキュリティキー、ICカード
  • 生体:指紋、顔、虹彩

多要素認証(MFA)とは、この3種類のうち異なる2つ以上を組み合わせる方式です。

パスワードと秘密の質問は、どちらも「知識」なので多要素になりません。

パスワードとスマートフォンのワンタイムコードなら、知識と所持の組み合わせで多要素です。

認証方式の種類を一覧で比較

Webで使われる認証方式は、本人確認の材料をどう送るかで整理すると、違いが見えます。

表の前に、方式を4つの考え方に分けた地図を置きます。

パスワードを毎回送る方式と、署名やトークンで証明する方式に大きく分かれ、後者がモダン認証の中心になります。

認証方式の全体マップ(考え方で分ける)
考え方
当てはまる方式
オフィスでたとえると
毎回パスワードを送る
Basic認証・Digest認証
部屋に入るたびに、社員番号を口頭で伝える
ログイン後は目印を持つ
セッションCookie・JWT
受付で入館証をもらい、以後は見せるだけ(控えを受付が持つか、本人が持つか)
外部の証明に任せる
OpenID Connect・SAML
取引先の受付が書いた「この人は本人です」という紹介状
権限だけを渡す
OAuth 2.0
合鍵を、使える範囲と期限を決めて貸す(本人確認はしない)
パスワードを使わない
パスキー
自分の端末にだけある鍵で署名する
NOTEOAuth 2.0だけは認証ではなく認可の仕様です。ログインに使うときは、OpenID Connectを組み合わせます。

地図を頭に入れたうえで、方式ごとの違いを表で確かめます。

方式認証か認可か本人確認の材料サーバーが覚えること世代主な用途
Basic認証認証ID・パスワードを毎回送るなしレガシー簡易な目隠し、古いプロトコル
Digest認証認証パスワードのハッシュ値を毎回送る使い捨ての値(nonce)の管理レガシーほぼ新規採用なし
フォーム+セッションCookie認証(ログイン後の状態も管理)ログイン時のパスワード、以後はセッションIDセッションを保持現役ブラウザ中心のWebアプリ
トークン(JWT)どちらにも使える(情報の入れ物)署名付きトークン原則なしモダンSPA、モバイル、API
OAuth 2.0認可(認証ではない)アクセストークン(認可)認可サーバーが管理モダン外部サービスへのアクセス許可
OpenID Connect認証(OAuth 2.0の上に載る)IDトークン認可サーバーが管理モダン「Googleでログイン」
SAML 2.0認証XMLのアサーション(本人確認済みの証明書)IdP(ID提供側)が管理モダン企業内のシングルサインオン
パスキー(WebAuthn)認証公開鍵暗号(鍵のペア)による署名公開鍵を保存モダンパスワードレスログイン

世代の列は、次の章で説明する線引きに従っています(フォームとセッションCookieは、毎回パスワードを送らない点でモダン寄りですが、ブラウザ向けの定番として「現役」と書いています)。

もう1つ、選ぶときに効く「安全性」の観点でも並べます。

方式盗まれたときの被害取り消しやすさフィッシングへの強さ実装の重さ(目安)
Basic認証パスワードそのものが読み取られるログアウトがない。パスワード変更で止める弱い(パスワードを入力する)かなり軽い
Digest認証サーバー側に保存した値が漏れると危ないパスワード変更で止める弱い(パスワードを入力する)軽い
セッションCookieセッションIDを奪われると、なりすまされるサーバー側で削除すれば即座に止まるログイン方法しだい(MFAで補う)普通(フレームワークの標準機能)
JWT期限が切れるまで使われる取り消しにくい(短い期限とリフレッシュトークンで補う)ログイン方法しだいやや重い(署名の検証と鍵の管理)
OAuth 2.0アクセストークンの範囲と期限内で使われる認可サーバーで失効させられる認可サーバーのログイン方法しだい重い(既存のサービスやライブラリに任せたい)
OpenID ConnectOAuth 2.0と同じ。IDトークンは署名で検証するOAuth 2.0と同じIdPのログイン方法しだい重い(同上)
SAML 2.0署名付きの証明書は短時間だけ有効IdP側でアカウントや連携を止めるIdPのログイン方法しだい重い(XML署名と設定の突き合わせ)
パスキーサーバーには公開鍵しかなく、漏れても悪用できないサーバー側で公開鍵を削除する強い(鍵が登録したサイトのドメインに結び付く)やや重い(端末をなくしたときの復旧手段が必要)

「実装の重さ」は目安です。OAuth 2.0・OpenID Connect・SAMLは、自作せずに既存のサービスやライブラリに任せる前提で考えると、負担は大きく下がります。

レガシー認証とモダン認証(先進認証)の違い

レガシー認証とモダン認証の違いは、一言で言えば「毎回パスワードを渡すか、本人確認の結果として発行された期限付きの証明を渡すか」です。

同じ言葉でも文脈で指す範囲が違うので、一般論とMicrosoftの用語を分けて押さえます。

後者は、Microsoft 365やExchange Onlineの管理者が実際に直面する話です。

一般的な違い

レガシー認証からモダン認証へ(毎回送るものの違い)
LEGACY / 基本認証などリクエストのたびにIDとパスワードを送るクライアントが資格情報を保存し続ける。MFAを組み込みにくい。
→
MODERN / 先進認証認証サーバーで本人確認し、期限付きのトークンを発行するトークンは対象のアプリとリソースに限定され、MFAや条件付きアクセスを足せる。

比較軸を並べると次のとおりです。

比較軸レガシー認証モダン認証
毎回送るものID・パスワードアクセストークン
盗まれたときの被害パスワード自体が漏れ、他サービスで再利用されるトークンの有効期間と範囲に限られる
MFA組み込みにくい認証サーバー側で適用できる
失効パスワード変更まで有効期限切れ、または取り消しで無効化
代表例Basic認証、POP/IMAP/SMTP AUTHのパスワード認証OAuth 2.0、OpenID Connect

トークンを使えば安全、と短絡はできません。

トークンの保存先を誤ればXSSで抜かれますし、署名の検証を省けば偽造されます。

モダン認証の利点は、被害の範囲と期間を設計で絞れる点にあります。

Microsoftの「基本認証」「レガシー認証」「先進認証」

Microsoft Learnの日本語版では、モダン認証が「先進認証」「最新の認証」と訳されていて、表記が揺れています。

どちらも英語のModern Authenticationを指します。

Microsoftの文脈での対応は、次のとおりです。

基本認証
アプリがリクエストごとにユーザー名とパスワードを送る方式。Basic認証そのもの。
レガシー認証
多要素認証をサポートしないプロトコルでの認証の総称。基本認証が代表例。
先進認証(モダン認証)
MFAなどの認証方法、OAuthによる承認、条件付きアクセスをまとめた呼び名。

MicrosoftはMicrosoft Learnで、先進認証を次の3つの組み合わせとして説明しています。

  • 認証方法:多要素認証、スマートカード認証、クライアント証明書ベースの認証
  • 承認方法:MicrosoftによるOAuthの実装
  • 条件付きアクセスポリシー:モバイルアプリケーション管理(MAM)とMicrosoft Entra条件付きアクセス

先進認証は単体の技術名ではなく、複数の仕組みを束ねた総称です。

検索で「先進認証とは」と調べて要領を得ないのは、この総称という性格のせいでしょう。

Exchange Onlineで基本認証が使えなくなった経緯

基本認証は、Exchange Onlineではすでに廃止済みです。

Microsoft Learnによると、21Vianet運営版を除く環境では、2022年10月1日から無効化が始まりました。

現在はすべてのテナントで基本認証が無効です。

対象は、Exchange ActiveSync、POP、IMAP、リモートPowerShell、Exchange Webサービス、オフラインアドレス帳、自動検出、Outlook for WindowsとMacです。

こうしたプロトコルは、OAuth 2.0トークンベースの承認を使う方式への移行が求められています。

Microsoftが基本認証を止めた根拠は、攻撃の統計に表れています。

Microsoft Learnには、資格情報スタッフィング攻撃の97%以上、パスワードスプレー攻撃の99%以上がレガシー認証を利用している、というMicrosoftの分析が掲載されています。

同じページによれば、これらの攻撃は基本認証を無効化またはブロックすると止まります。

SMTP AUTH(メールソフトや業務システムがメールを送るときの認証)だけは別扱いです。

使われていないテナントでは無効化されましたが、使われているテナントでは今も基本認証で送信できます。

Microsoftは2026年1月、SMTP AUTHの基本認証を止める予定を次のように更新しました(Exchange Team Blog)。

  • 2026年12月まで:今までどおり基本認証で送信できる
  • 2026年12月末:既存のテナントで既定で無効になる。管理者が設定で有効に戻すことはできる
  • 2026年12月末より後に作るテナント:最初から基本認証は使えず、OAuthが前提になる
  • 2027年後半:最終的な廃止日が発表される予定

当初の予定(2026年3月から拒否を始め、4月末に完全に止める)からは後ろにずれています。

複合機のスキャン送信や監視ツールの通知など、ユーザー名とパスワードでメールを送っている仕組みがあるなら、12月末より前にOAuthへの切り替えか、Microsoft Graph APIのsendMailへの移行を検討してください。

予定はこれまでも変わってきたので、作業の前に公式の発表で最新の日付を確かめてください。

自分のテナントでレガシー認証を洗い出す手順

レガシー認証が残っているかどうかは、サインインログで調べられます。

管理者が実際に行う流れは、次のとおりです。

  1. Microsoft Entra管理センターで、サインインログを開く
  2. 「クライアントアプリ」列を表示し、レガシー認証プロトコルでフィルターする
  3. 「ユーザーサインイン(非対話型)」タブも同様に確認する
  4. 使っているクライアントとユーザーを特定し、OAuth対応版へ移行する
  5. 条件付きアクセスで「Exchange ActiveSyncクライアント」と「その他のクライアント」を対象にブロックポリシーを作る

ブロックポリシーは、最初に「レポート専用」で作ります。

影響範囲を確認してから「オン」に切り替えれば、業務で使っている接続を巻き込むリスクを抑えられます。

ロックアウトを避けるため、緊急アクセス用アカウントを除外対象に入れておくのもMicrosoftの推奨です。

Basic認証とDigest認証:パスワードを毎回送る方式

Basic認証とDigest認証は、HTTPの仕様に標準で含まれる最も古い認証方式です。

どちらもリクエストごとに本人確認の材料を送るため、レガシー認証に分類されます。

部屋に入るたびに社員番号を口頭で伝えるようなもので、聞かれてしまえば誰でも使い回せます。

今から新しいサービスで採用する場面は少なくなりましたが、既存システムの保守や、開発用サイトの簡易な保護では今も出会います。

Basic認証(RFC 7617)

Basic認証とは、ユーザーID:パスワード をBase64(データを英数字だけの文字列に置き換える変換)で変換し、Authorization ヘッダーに入れて送る方式です。

仕様はRFC 7617(2015年9月)で定められています。RFCはインターネット技術の仕様書で、番号で呼ばれます。

サーバーは未認証のリクエストに401と WWW-Authenticate ヘッダーを返し、ブラウザがIDとパスワードの入力ダイアログを出します。

Basic認証の流れ(以後は毎回パスワードを送る)
1
ブラウザ → サーバー認証なしでリクエスト
2
サーバー → ブラウザ401 と WWW-Authenticate「認証してください」の合図
3
ブラウザIDとパスワードの入力ダイアログを出す
4
ブラウザ → サーバーAuthorization: Basic … を付けて再リクエストユーザーID:パスワードをBase64で変換した文字列
5
ブラウザ → サーバー以降のリクエストにも毎回同じヘッダーを付けるここが「毎回パスワードを送る」ということ
NOTEBase64は暗号化ではないため、HTTPS(TLS)で通信を守ることが前提です。
GET /admin HTTP/1.1
Host: example.com
Authorization: Basic dXNlcjpwYXNz

dXNlcjpwYXNz は、user:pass をBase64で変換しただけの文字列です。

Base64は暗号化ではなく、誰でも元に戻せます。

RFC 7617自身が、TLSなどの外部のセキュアな仕組みと組み合わせない限り、安全な認証方法とは考えられないと明記しています。

弱点をまとめます。

  • 通信が傍受されると、パスワードがそのまま読み取られる
  • ログアウトの概念がなく、ブラウザを閉じるまで資格情報が使われ続ける
  • ID・パスワードの組が毎回流れるため、MFAを差し込みにくい
  • ユーザーIDにコロンを含められない(仕様上、最初のコロンで区切るため)

使ってよいのは、HTTPSを前提にした開発用サイトの目隠しなど、漏れても被害が限られる場面です。

ユーザー情報を扱う本番のログインには向きません。

Digest認証(RFC 7616)

Digest認証とは、パスワードそのものではなく、サーバーが発行した使い捨ての値(nonce)とパスワードから計算したハッシュ値(元のパスワードに戻せない形に変換した値)を送る方式です。

仕様はRFC 7616(2015年9月)で、従来のRFC 2617を置き換えています。

パスワードが平文で流れない点がBasic認証に対する改善です。

RFC 7616はハッシュにSHA-256とSHA-512/256を対応させ、MD5は後方互換のためだけに残しています。

ただしサーバーはハッシュ計算のために、パスワードか、それに相当する値を持っている必要があります。

bcryptのような遅いハッシュで保存する現代のパスワード管理と相性が悪く、仕様自身もパスワードファイルの保護を求めています。

そのため、新規の設計で選ばれる場面はほぼありません。

セッションCookieとJWT:ログイン後の状態をどう持つか

ブラウザ向けのWebアプリが現役で使う認証は、ログイン時にIDとパスワードを確認し、以後は別の目印で本人を識別する形です。

その目印をサーバーが覚えておくのがセッション、署名付きの文字列にしてクライアントが持つのがJWTです。

セッションCookieとJWTの流れの違い(控えをどちらが持つか)

SESSION / サーバーが覚える

1
ブラウザ → サーバーIDとパスワードを送る
2
サーバーセッションIDを発行し、ユーザー情報をサーバー側に保存する控えをサーバーが持つ
3
サーバー → ブラウザセッションIDをCookieで渡す
4
ブラウザ → サーバー以降はCookieが自動で付くサーバーは保存した情報と照らし合わせる

JWT / 本人が持ち歩く

1
クライアント → サーバーIDとパスワードを送る
2
サーバー署名付きのJWTを作る。ユーザー情報は保存しない控えを持たない
3
サーバー → クライアントJWTを渡す
4
クライアント → サーバー以降は Authorization: Bearer で送るサーバーは署名を検証するだけ
NOTE違いは2番の手順に集約されます。ログアウトや取り消しのしやすさの差は、この「控えを持つかどうか」から生まれます。

どちらを選ぶかで、ログアウトの扱いやスケールの考え方が変わります。

受付で入館証をもらう場面に置き換えると、受付が入館証の控えを持つのがセッション、控えは持たず偽造できない印だけで確かめるのがJWTです。

フォーム認証+セッションCookie

フォーム認証+セッションCookieとは、ログインフォームでパスワードを確認し、サーバーが発行したセッションIDをCookieで持たせる方式です。

サーバーはセッションIDをキーに、ユーザー情報をメモリやRedisなどに保存します。

ブラウザは以降のリクエストにCookieを自動で付けるので、アプリ側のコードは単純になります。

Set-Cookie: SESSIONID=a1b2c3d4; Path=/; Secure; HttpOnly; SameSite=Lax

Cookieには属性を付けます。

  • Secure:HTTPSの通信でだけ送る
  • HttpOnly:JavaScriptから読めなくして、XSSによる抜き取りを防ぐ
  • SameSite:他サイトからのリクエストにCookieを付けない範囲を決め、CSRFを抑える

サーバー側で状態を持つので、強制ログアウトや端末の切り離しが即座にできます。

一方で、ログイン成功の直後にセッションIDを必ず再発行しないと、事前に仕込まれたIDで乗っ取られる(セッション固定攻撃)危険が残ります。

Javaで組む場合の実装は、Spring Security入門で詳しく扱っています。

トークン認証とJWT(RFC 7519)

JWT(JSON Web Token)とは、ユーザーの情報(クレーム)をJSONで持たせ、デジタル署名(改ざんされていないことを確かめる印)を付けた文字列です。

仕様はRFC 7519で、ヘッダー.ペイロード.署名 の3つをピリオドでつないだ形をとります。

JWTの構造(3つの部分に分けて見る)

JWT / ピリオドでつなぐ3つの部分

ヘッダー1.ペイロード2.署名3

↓ サーバーは署名を確かめて、ペイロードを信用する

PARTS / それぞれの役割

1ヘッダー署名の方式などの設定
2ペイロードユーザー情報(クレーム)と有効期限 exp
3署名1と2が改ざんされていないことを確かめる印
NOTEペイロードは暗号化されていません。署名は改ざんを見つけるためのもので、中身は誰でも読めます。

サーバーは署名を検証するだけで本人性を確かめられるので、セッションの保存先を持たずに済みます。

{
  "sub": "user-1234",
  "iss": "https://auth.example.com",
  "aud": "my-api",
  "iat": 1790000000,
  "exp": 1790000900
}

上はペイロードの例です。

exp が有効期限で、この例は発行から900秒(15分)です。

APIを呼ぶときは、トークンを Authorization: Bearer <トークン> で送ります。

JWTのペイロードは暗号化されていません。署名で改ざんを検知できるだけで、中身はBase64URLを戻せば誰でも読めます。パスワードや個人情報の詳細は入れない設計にします。

JWTの弱点は、発行済みのトークンを途中で取り消しにくい点です。

サーバーが状態を持たない代わりに、有効期限が来るまでは検証を通り続けます。

対策は、アクセストークンの有効期間を短くし、更新用のリフレッシュトークンを別に管理する構成が定番です。

保存先も判断が分かれます。

localStorage に置くとXSSで読み取られるので、ブラウザではHttpOnlyのCookieに入れる設計のほうが安全側です。

署名の検証では、アルゴリズムの指定をトークンのヘッダーに任せないのも基本です。JWTの安全な使い方はRFC 8725にまとまっています。

セッションとJWTの比較

比較軸セッションCookieJWT
状態の保存場所サーバークライアント(トークン自体)
強制ログアウト即時にできる有効期限まで残る(工夫が必要)
水平スケールセッション共有ストアが必要検証だけで済む
主な攻撃対象セッション固定、CSRFトークンの盗難、署名検証の不備
向く場面ブラウザ中心のWebアプリモバイル、複数サービスをまたぐAPI

「JWTのほうが新しいから良い」ではありません。

ブラウザで同一ドメインのWebアプリなら、セッションCookieのほうが失効の面で扱いやすいケースが多数です。

OAuth 2.0・OpenID Connect・SAML・パスキー

ここからは、自分のサービスでパスワードを預からない方式です。

外部サービスへの権限委譲、外部IDでのログイン、企業のシングルサインオン、パスワードレスの4つを順に扱います。

似た名前が多いので、「何を決める仕様か」で切り分けます。

たとえると、OAuth 2.0は合鍵を貸す仕組み、OpenID Connectは「この人は本人です」と書いた紹介状、SAML 2.0は企業間で使う紹介状、パスキーは本人の端末にだけある鍵です。

OAuth 2.0は認可、OpenID Connectは認証

OAuth 2.0(RFC 6749)とは、ユーザーのパスワードを渡さずに、アプリに限定的なアクセス権を与える認可の仕様です。

「このアプリに、私のGoogleカレンダーの読み取りだけを許可する」といった場面に使います。

アプリが受け取るのはアクセストークンで、本人が誰かを証明するものではありません。

OpenID Connect(OIDC)とは、OAuth 2.0の上に本人確認の仕組みを足した仕様です。

認可サーバー(トークンを発行する側)はアクセストークンに加えてIDトークン(JWT形式)を返し、アプリは「誰がログインしたか」を知れます。

「Googleでログイン」は、このOIDCで動いています。

  • OAuth 2.0:何にアクセスしてよいかを渡す(認可)
  • OpenID Connect:誰がログインしたかを知る(認証)

Authorization Code+PKCEの流れ

現在の標準フローは、認可コードを経由するAuthorization Code Flowです。

認可コードは、ブラウザ経由で届く1回限りの引換券にすぎません。

アプリはそれをバックエンドから認可サーバーへ送り、トークンと交換します。

動きで追いたい人向けに、人・アプリ・認可サーバーのやりとりをアニメにしました。

Authorization Code+PKCEをアニメで追う(人・アプリ・認可サーバーのやりとり)
ユーザー
手元にあるもの
アプリ
手元にあるもの
認可サーバー
手元にあるもの
いまの操作
届いたもの
NOTE「手元にあるもの」の欄で、誰が何を持っているかが変わっていく様子を追えます。🔑アクセストークンは「何をしてよいか」の許可証、🪪IDトークンは「誰か」の身分証です。

止めて読みたいときは、下の静止した図を見てください。

Authorization Code+PKCEの流れ(ログインからトークン受け取りまで)
1
ユーザー → アプリログインをクリック
2
アプリ → 認可サーバー認可リクエストcode_challenge(code_verifier のハッシュ値)を付けて送る
3
認可サーバー → ユーザーログインと同意の画面
4
ユーザー → 認可サーバー認証して許可
5
認可サーバー → アプリ認可コードブラウザ経由で届く1回限りの引換券
6
アプリ → 認可サーバー認可コードと code_verifier元の値を示せなければ、トークンは渡されない
7
認可サーバー → アプリアクセストークンとIDトークン
8
アプリ → ユーザーログイン完了
NOTEPKCEは、認可コードが途中で奪われても悪用されないようにする補強です。

アプリはリクエストごとにランダムな code_verifier を作り、そのハッシュ値(code_challenge)を最初に送ります。

コードを交換するときに元の値を示せなければ、トークンは渡されません。

OAuth 2.0のセキュリティ上のベストプラクティスは、2025年1月にRFC 9700としてまとまりました。

RFC 9700は、認可サーバーにPKCEのサポートを求め、公開クライアントにはPKCEの使用を求めています。

一方でImplicit grantは使わないことを推奨(SHOULD NOT)しています。

Resource Owner Password Credentials grantは、使ってはならない(MUST NOT)扱いです。

古い解説記事にあるImplicit Flowやパスワード付与は、現在は避ける方式です。

SAML 2.0とパスキー(WebAuthn)

SAML 2.0とは、XMLのアサーション(本人確認済みの証明書)をIdP(ID提供側)からサービス提供側へ渡して、シングルサインオンを実現する仕様です。

2005年にOASISが標準化した企業向けの仕様で、社内ポータルやSaaSの連携に今も使われます。

新規でログインを組むならOIDCのほうが扱いやすく、SAMLは取引先の要件で必要になる場面が中心です。

SAML 2.0のシングルサインオンの流れ
1
ユーザー → サービス(SP)サービスにアクセスする
2
サービス → ユーザーIdPのログイン画面へ案内する
3
ユーザー → IdPIdPでログインする会社のアカウントなど
4
IdP → サービス署名付きのアサーションを渡すブラウザ経由で届く本人確認済みの証明書
5
サービス署名を確かめて、ログインを許可する
NOTESPはサービス提供側、IdPはID提供側のことです。一度IdPでログインすれば、別のサービスでは入力なしで入れます。

パスキーとは、WebAuthnとFIDOの仕様に基づく、公開鍵暗号を使ったパスワードレス認証です。

登録時に端末の中で秘密鍵と公開鍵のペアを作り、公開鍵だけをサーバーに預けます。

ログイン時はサーバーが出した課題(チャレンジ)に、端末が秘密鍵で署名して返すので、パスワードもその代わりになる値もネットワークを流れません。

パスキーの登録とログイン(鍵のペアで確かめる)

REGISTER / 登録するとき

1
端末秘密鍵と公開鍵のペアを作る秘密鍵は端末の外に出ない
2
端末 → サーバー公開鍵だけを預ける

LOGIN / ログインするとき

1
サーバー → 端末チャレンジ(使い捨ての課題)を送る
2
端末指紋や顔などで本人が確認できたら、秘密鍵で署名する
3
端末 → サーバー署名を返すパスワードは流れない
4
サーバー公開鍵で署名を確かめる
NOTE鍵は登録したサイトのドメインに結び付くため、偽サイトでは署名が作られません。

パスキーが強いのは、鍵が登録したサイトのドメインに結び付く点です。

偽サイトでは署名が作られず、フィッシングに引っかかりません。

パスワード認証を残す場合も、MFAとあわせて段階的にパスキーへ寄せていく方針が現実的です。

用途別の選び方:判断フロー

選ぶときは、方式の新旧より先に「誰がどこからログインするか」を決めます。

自社でIDを持つのか、外部のIDを使うのか。クライアントがブラウザ中心なのか、モバイルや別ドメインのAPIなのか。

この分岐をたどると、候補は2〜3個に絞れます。

認証方式の判断フロー(Q1から順に答える)
QUESTION / 質問
答え
選ぶ方式
Q1. 用途は何か?
検証サイトの目隠し
Basic認証とHTTPS
Q1
ユーザーがログインするサービス
Q2へ
Q2. ID管理はどこか?
Googleなど外部ID
OpenID Connect
Q2
取引先や社内のIdP
SAML 2.0 または OIDC
Q2
自社でIDを持つ
Q3へ
Q3. クライアントは何か?
ブラウザ中心・同一ドメイン
セッションCookie+MFAとパスキーを追加
Q3
モバイルや別ドメインのAPI
短命なアクセストークン+MFAとパスキーを追加

状況別の対応を表にします。

状況選ぶ方式理由
開発中サイトを関係者だけに見せたいBasic認証+HTTPS設定が数行で済み、漏れても被害が小さい
自社のWebアプリ(ブラウザ中心)セッションCookie即時に失効でき、実装も標準的
モバイルアプリとAPIOAuth 2.0/OIDC+短命トークン端末ごとに権限を絞れる
「Googleでログイン」を付けたいOpenID Connectパスワードを自社で預からずに済む
取引先の企業SSOに合わせるSAML 2.0相手側の要件になっていることが多い
乗っ取り対策を強めたいパスキー、MFAフィッシングに強い

メールシステムなどMicrosoft 365と連携する側は、方式を選ぶ立場ではなく、基本認証をやめてOAuth 2.0に対応する立場です。

POPやIMAPで基本認証に依存したクライアントは、OAuth 2.0対応版への更新か、別の接続手段への移行が求められます。

よくある質問

Web認証と、レガシー認証・モダン認証の違いについて、よく聞かれる質問をまとめました。

Q1. Web認証とは何ですか?

A1. Webサイトやアプリにアクセスした相手が本人かどうかを、サーバーが確かめる仕組みです。パスワード、トークン、生体、公開鍵暗号など、本人確認の材料の違いで方式が分かれます。

Q2. レガシー認証とモダン認証の違いは何ですか?

A2. レガシー認証はリクエストごとにID・パスワードを送る方式で、MFAを組み込みにくい特徴があります。モダン認証は認証サーバーで本人確認し、期限付きのトークンを使う方式で、MFAや条件付きアクセスを足せます。

Q3. 基本認証と先進認証の違いは何ですか?

A3. 基本認証はユーザー名とパスワードを毎回送る方式で、Exchange Onlineでは廃止済みです(SMTP AUTHだけは2026年12月末に既定で無効になる予定)。先進認証はMicrosoftの用語で、MFAなどの認証方法、OAuthによる承認、条件付きアクセスを束ねた総称です。

Q4. JWTとセッションCookieはどちらを選ぶべきですか?

A4. ブラウザ中心のWebアプリならセッションCookieが扱いやすく、強制ログアウトも即時にできます。モバイルアプリや複数のAPIをまたぐ構成なら、短命なトークン(JWTなど)が向きます。

Q5. OAuthとOpenID Connectは何が違いますか?

A5. OAuth 2.0は権限を渡す認可の仕様で、アクセストークンを発行します。OpenID ConnectはOAuth 2.0にIDトークンを足して、誰がログインしたかを確認できるようにした認証の仕様です。

Q6. JWTをlocalStorageに保存するのは危険ですか?

A6. XSSの脆弱性があると、JavaScriptから読み取られてトークンを盗まれます。ブラウザで扱うなら、HttpOnly属性を付けたCookieに入れる設計のほうが抜き取られにくくなります。

Q7. Basic認証は今でも使ってよいですか?

A7. HTTPSを前提に、検証サイトの目隠しなど漏れても被害が小さい場面なら使えます。ユーザー情報を扱う本番のログインや、MFAが必要な場面には向きません。

Web認証の方式選びのまとめ

Web認証は、毎回パスワードを送る世代から、期限付きトークンと公開鍵暗号を使う世代へ移っています。

Microsoftが基本認証を止めたのも、この流れの一部です。

2026年10月時点で、RFC(7617・7616・7519・6749・9700)とMicrosoft Learnを突き合わせて書いています。

  • 認証は「誰か」、認可は「何をしてよいか」。OAuth 2.0は認可、OpenID Connectが認証
  • Basic認証とDigest認証はレガシー側。HTTPSなしでは使わず、本番のログインには選ばない
  • ブラウザ中心のWebアプリはセッションCookie、モバイルや複数APIはトークンが基本
  • JWTは暗号化されておらず、取り消しにくい。有効期間を短くし、保存先に気を配る
  • OAuthはAuthorization Code+PKCEが標準。Implicit grantとパスワード付与は避ける
  • 先進認証はMicrosoftの用語で、MFA・OAuth・条件付きアクセスの総称
  • Exchange OnlineのSMTP AUTHの基本認証は、2026年12月末に既定で無効になる予定

認証を自作する場面は減っています。

ログインを組むときは、まずOIDCの外部IdPやフレームワークの標準機能に任せられないかを検討してください。

Javaで試すなら、Spring Security入門から始めるのが近道です。

HTTPS側の仕組みは、TLSの仕組みで図解しています。

NEXT STEP
自分のアプリのログインが、セッションCookieとトークンのどちらでログイン状態を持っているかを確かめてみてください。

ブラウザの開発者ツールで、Cookieか Authorization ヘッダーのどちらが送られているかを見れば分かります。Microsoft 365の管理者なら、サインインログでレガシー認証が残っていないかを見るところからです。

途中経過は、また書きます。

REVISIONS / 改訂履歴
REV.DATE内容
62026-10-29Microsoft 365のSMTP AUTH基本認証の廃止予定を2026年1月の発表に合わせて更新
52026-10-21同じ説明の繰り返しを減らし、読みやすく整えた
42026-10-15図解を描き直し(図面のデザインにそろえた)
32026-08-212026年8月時点の情報で全体を見直し(古い記述を5件更新)
… ほか1回の改訂
12025-09-07初版
NEXT READ本棚から1本

AIで開発を組み直すなら、まずこの5冊から

入門・実践・設計まで、Claude Codeの本をレベル別に5冊選んで比べました。

→ おすすめ5冊を見る

  • この記事を書いた人
  • 最新記事

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

IT全般