この記事は
OAuthのフローとか、なんとなくの処理手順はわかるんだけど、だから結局OAuthってそれ本体は何で何がどうなってそうなってるの?としっくりこない人のための解説記事です。
OAuth(オーオース)
オーオースって読むんですね。ずっと読めなかったw
読み方を知るだけでも少し理解が深まります。
OAuthを使ってる場面
-「Googleでログイン」
-「Appleでサインイン」
-「LINEで認証」
-「X(旧Twitter)連携でアカウント作成」
よく見かけるこれらがOAuthを使ったログイン方法。
サイトAにログインする時、サイトAにユーザー登録しなくてもGoogleやLINEのアカウントを使ってログインできたり、Xのデータを参照できる。サイトAにこのユーザーのこの範囲のデータを使っていいですよって許可する処理の規格がOAuth。
厳密には、「GoogleやLINEのアカウントを使ってログインできる」機能は、OAuthを基盤として拡張されたOpenID Connect (OIDC) という規格が主に担っていますが、OAuthがその認可の仕組みを提供しています。
で、OAuthって何?
規格(プロトコル)の1つ。
物理的な何かではないしソースコードでもソフトウェアでもありません。
GoogleやX(旧Twitter)のような大規模なサービス(プラットフォーム)が、外部のアプリケーションに対して提供する仕組み。
具体的には、GoogleやXなどの大規模サービスは、OAuthの文脈において、認可サーバー機能 (Authorization Server)とリソースサーバー機能 (Resource Server)という2つの重要な役割と機能を提供しています。
規格(プロトコル)なので、文書です。公式がこちら
一般的に使われるBearer Tokenのプロトコル(文書)はこちら
OAuthが「パスワードを渡さずにアクセス許可」するってどういう意味?
フローの中で、OAuthを提供しているサービスのアカウント(例えばGoogleやLINE)にはログインする必要があるのでOAuth提供サービスのパスワードを使う必要があるが、OAuth提供サービスのパスワードをOAuth利用サービスに入力はしていない=OAuth利用サービスにパスワードを渡していない、ということ。
OAuthが登場した目的はパスワードを第三者に渡さず、”必要最小限の権限だけ”を外部アプリに委譲できるようにすること。
OAuthの言葉の使い方
- アプリAが「Googleアカウントでログイン」のようにOAuth提供サービスを使っている場合「OAuthを使っている」のように使います
- TwitterのAPIにアクセスするためにOAuthの仕組みを利用しているのように表現します
- GoogleやTwitterなどは外部アプリに対して安全なアクセス方法(OAuth)を用意しているので「OAuthを提供している」といいます。
OAuthは「認証」ではない
認証と認可という登場人物がいます。
- 認証(Authentication)=「あなた」が誰かを確かめる
- 認可(Authorization)=「あなた」が何を許可するか決める
OAuthが扱うのは認可だけです。
しかし、OAuthを使うフローの中で、OAuth提供サービスのアカウントへのログイン画面が表示され、OAuth提供サービスのアカウントへログイン(認証)することが必要なため、OAuth=認証、と誤解されがち。
OAuthのAccessTokenは本人確認の証拠ではない
OAuth提供サービスが発行するアクセストークンは「誰宛に発行したものか」という情報を持たない。
そのため、そのトークンを利用してOAuth提供サービスのデータにアクセスした場合、そのトークンを利用してアクセスしたことはわかるが、誰がそのトークンを利用してアクセスしたかがわかりません。
つまり攻撃者にトークンが盗まれOAuth提供サービスに不正ログインされても、不正ログインだとわからないという問題があります。
これらのセキュリティ問題を埋めるためにOIDC(OpenIDConnect)が誕生します。
続きは別記事へ。
コメント