ふくしま

ソフトウェアエンジニア

OAuthとかOpenIDConnectがなぜ安全とされるのかBasic認証との対比で考えてみた

疑問に思った背景

Basic認証が危険な理由として「クレデンシャルを直接クライアントからサーバに送るから」という話がある。 確かに、Basic認証はAuthorizationヘッダーにクレデンシャルをエンコードして送りつける。 なんらかの方法でクレデンシャルが盗まれたら(例えばTLS化していない通信で盗聴されたり、サーバに保存されているクレデンシャルがクラックされたり)、即座にサーバにある大事な情報が暴露される。

では、なぜOAuthとかの認証認可フレームワークを使えば、Basic認証よりも安全になるんだろうか?

自分が調べた感じ

一言で言えば「認可サーバがアクセストークンを発行し、アクセストークンの検証を行うから」だと思う。 具体的には、クライアントと認可サーバがクレデンシャルのやり取りをし、認可サーバがアクセストークンを発行する。サーバはクライアントから送られたアクセストークンを認可サーバに確認する。

つまり、発行と検証のステップを認可サーバに移譲することで、クライアントとサーバの通信でクレデンシャルを直接扱わないようにしている。 サーバはクレデンシャルを保存しなくて良くなるし、もしアクセストークンが盗まれてもそのトークンは期限付きのものであるため被害を多少は抑えられる。 だから、Basic認証よりも安全なのだろう。