いくつかのシナリオは、oauth2(またはその他の認証)システムを設計する際のアクセストークンと更新トークンの目的、およびエンジニアリングのトレードオフを説明するのに役立ちます。
Webアプリのシナリオ
Webアプリのシナリオでは、いくつかのオプションがあります。
- 独自のセッション管理がある場合は、セッションIDサービスに対して、セッションIDに対してaccess_tokenとrefresh_tokenの両方を保存します。リソースへのアクセスが必要なユーザーからページがリクエストされた場合は、access_tokenを使用します。access_tokenの有効期限が切れている場合は、refresh_tokenを使用して新しいページを取得します。
誰かがなんとかセッションを乗っ取ったとしましょう。可能なことはページをリクエストすることだけです。
- セッション管理がない場合は、access_tokenをCookieに入れ、それをセッションとして使用します。次に、ユーザーがWebサーバーにページを要求するたびに、access_tokenを送信します。アプリサーバーは、必要に応じてaccess_tokenを更新できます。
1と2の比較:
1では、access_tokenとrefresh_tokenは、認証サーバー(この場合はgoogle)とアプリサーバーの間のネットワーク経由でのみ移動します。これは安全なチャネルで行われます。ハッカーはセッションを乗っ取ることができますが、彼らはあなたのウェブアプリと対話することしかできません。2では、ハッカーはaccess_tokenを奪い、ユーザーがアクセスを許可したリソースへの独自のリクエストを作成できます。ハッカーがaccess_tokenを手に入れても、リソースにアクセスできる短いウィンドウしかありません。
どちらの方法でも、refresh_tokenとclientid / secretはサーバーにしか認識されないため、Webブラウザーから長期間のアクセスを取得することはできません。
oauth2を実装していて、アクセストークンに長いタイムアウトを設定しているとしましょう。
1)では、アプリサーバーで非表示になっているため、短いアクセストークンと長いアクセストークンの間に大きな違いはありません。2)では、誰かがブラウザでaccess_tokenを取得し、それを使用して長期間にわたってユーザーのリソースに直接アクセスできます。
モバイルシナリオ
モバイルでは、私が知っているいくつかのシナリオがあります。
clientid / secretをデバイスに保存し、デバイスのオーケストレーションがユーザーのリソースへのアクセス権を取得するようにします。
バックエンドアプリサーバーを使用してclientid / secretを保持し、オーケストレーションを実行します。一種のセッションキーとしてaccess_tokenを使用し、クライアントとアプリサーバーの間で渡します。
1と2の比較
1)デバイスにclientid / secretを設定すると、それらはもう秘密ではありません。もちろん、ユーザーの許可を得れば、誰でも逆コンパイルして、まるで自分のように振る舞うことができます。access_tokenとrefresh_tokenもメモリ内にあり、侵害されたデバイスからアクセスされる可能性があります。つまり、ユーザーが認証情報を提供しなくても、誰かがアプリとして動作する可能性があります。このシナリオでは、refresh_tokenはaccess_tokenと同じ場所にあるため、access_tokenの長さはハッカビリティに影響しません。2)では、clientid / secretも更新トークンも危険にさらされています。ここで、access_tokenの有効期限の長さは、ハッカーがユーザーのリソースを入手した場合に、ユーザーのリソースにアクセスできる時間を決定します。
有効期限
ここでは、access_tokenの有効期限を、認証システムで保護している期間によって異なります。それがユーザーにとって特に価値のあるものである場合は、短くする必要があります。価値の低い何か、それは長くなることができます。
グーグルのような一部の人々は、refresh_tokenを期限切れにしません。Stackflowのようなものはそうします。有効期限の決定は、ユーザーの使いやすさとセキュリティの間のトレードオフです。更新トークンの長さは、ユーザーが返す長さに関連しています。つまり、更新をユーザーがアプリに戻る頻度に設定します。更新トークンが期限切れにならない場合、それらが取り消される唯一の方法は、明示的な取り消しによるものです。通常、ログオンは取り消されません。
長めのポストが役立つことを願っています。