Closed58

Authentication Strategies

tkrytkry
tkrytkry

HTTPでリソースへのアクセスを認証するメカニズム
認証情報はリクエストヘッダーに送信される

Authorization: Basic [Base64エンコードされたユーザー名とパスワード]
tkrytkry

Step 2

リクエストのAuthorizationヘッダーが有効なユーザー名とパスワードか、サーバーでチェックする

invalid: 401
valid: 200

tkrytkry

Step 3

ブラウザはwww-authenticateヘッダーを検出して、認証情報入力のアラートを表示する

tkrytkry

Step 4

ユーザーが認証情報を送信すると、ブラウザがbase64でエンコードして次のリクエストで送信する。認証情報はリクエストのAuhtoriazationヘッダーに含まれる

tkrytkry

Basic認証はAPIでも使用できますが、その場合は通常のトークンベースの認証と同様の扱いになります。

tkrytkry

Basic認証はTLS/HTTPSじゃないとセキュアではない。デコードできてしまうから。

tkrytkry
tkrytkry

ユーザーには一意の識別子が割り当てられ、この識別子はサーバーのメモリに保存されます。クライアントはすべてのリクエストにこのセッションIDを送信し、サーバーはそれを使用してユーザーを識別します。

tkrytkry

ステートフルな認証方法(認証セッションは取り消すことができない)

tkrytkry

Step 1

クライアントがログインリクエストを送る

tkrytkry

Step 2

サーバーは認証情報を検証し、セッションを作成してメモリに保存、生成されたセッションIDを返す

セッションIDはランダムで一意な識別子
セッションIDはredis、メモリ、DB、ファイルシステムなど格納してもいい

tkrytkry

Step 3

クライアントはセッションIDを受け取り、クッキーが有効な場合はクッキー、それ以外ではローカルストレージ、セッションストレージに保存する

tkrytkry

Step 4

クライアントは次のリクエストでセッションIDを一緒に送る
サーバーはそのセッションIDがストレージに存在するか確認する

tkrytkry

Step 5

ユーザーがログアウトすると、セッションは破棄(クッキーが削除され、サーバーからセッションが削除される)され、同じセッションIDは使用できなくなる

tkrytkry
tkrytkry

Basic認証では毎回ユーザーとパスワードが送られるが、トークンベース認証は、毎回クラインとからサーバーにトークンが送られる

トークンはサーバーで生成した文字列

tkrytkry

Step 1

クライアントがサーバーに認証情報を送る
トークンを生成するため

tkrytkry

Step 2

サーバーが認証情報が正しいかチェックしてレスポンスを返す

  • invalid: 422
    • Error response
  • valid: 200
    • token in body or header
tkrytkry

Step 3

クライアントはこのトークンをローカルストレージまたはクッキーに保存して、その後のリクエストで送信する

サーバーはトークンを検証して、401か200を返す

tkrytkry

トークンの特性

  • ランダムな文字列
  • 有効期限があり、その期限を過ぎると使えなくなる
  • 通常、Authorizationヘッダーに含まれる
  • サーバーはトークンを保存しない(ステートレス)
  • 通常、トークンは秘密鍵で署名されており、改ざんを検出できる
  • トークンは不透明(Opaque)または自己完結型(Self-Contained)
tkrytkry

ステートレスってどういうことかと思ってたけど、トークンは下記のどちらかであるらしい

  • Opaque
    • ランダムな文字列であり、認証サーバーによって検証可能。セッションIDのようなもの
      • たぶん秘密鍵の話だと思う
  • Self-Contained
    • JWTのようにトークンにデータが含まれている
    • クライアントで確認できる
tkrytkry

トークンベースの認証戦略の種類

  • SWT(Simple Web Tokens)
  • JWT(JSON Web Tokens)
  • OAuth(Open Authorization)
  • SAML(Security Assertions Markup Language)
  • OpenID
tkrytkry

セッションと同じやんけ、と思ってたけどサーバーでの値の持ち方が、ステートフルかステートレスかで違うっぽい

tkrytkry
tkrytkry

トークンベースの認証方式。RFC7519に基づく。
認証および安全な情報交換にしようできる。

安全な情報交換とは?

tkrytkry

他のトークン認証戦略と同様だけど、トークンの生成方法が異なる。

tkrytkry

トークンの特徴

トークンは通常URLセーフな文字列で、サーバーにヘッダー、ボディ、またはURLで渡すことができる。トークンは自己完結型で、データを保持している。誰でもその内容を見ることができる。

詳細は元資料にあるので割愛するが、ドット区切りで3つのパートに分割される

  • header
  • payload
  • signature

また、JWTの仕様として省略名が予約されている

tkrytkry

Step 1

トークン生成のためにユーザーとパスワードをリクエストする

Step 2

認証情報を検証する

Step 3

シークレットキーを使ってトークンを生成

Step 4

JWTを返す

Step 5

JWTをヘッダーにもった状態で、あるセキュアなエンドポイントにリクエストを送る

Step 6

JWTをシークレットキーを使って検証する
(つまり、payloadが改ざんされてないかsignatureをチェックするってことかな)

Step 7

レスポンスを返す

tkrytkry

OAuth — Open Authorization

https://roadmap.sh/guides/oauth

tkrytkry

ユーザーが自分のプライベートなリソースをサードパーティなシステムと共有できるようにするための認証プロトコル

tkrytkry

長過ぎるのでスキップしちゃうけど、twitterでログインとかそういうやつのはず
グラントがたくさんあってむずい〜

tkrytkry

SSO — Single Sign On

https://roadmap.sh/guides/sso

tkrytkry

関連しているが独立している複数のサービスに対して、単一のユーザーパスワードでログインできる認証戦略

Googleがいろんなサービス使えるみたいなやつらしい

tkrytkry

SAML - Security Assertion Markup Language

当事者間で認証および認可データを交換するための仕様。SSOまたはSAML実装には、3つの当事者が関与している

  • User
  • Identity Provider(IDP)
    • Userの認証・認可の情報をもってる
  • Service Provider(SP)
    • 特定のサービスやリソースを提供する組織や個人のこと
    • ユーザーの認証をIDPに委託する
tkrytkry

SAMLアサーションは認証情報を含むXML文書。信頼性を検証するために署名されている。

IDPはSPに対して、SAMLアサーションを送る
SPはそれによって許可する

tkrytkry

IDP XML

  • Configurations
    • SAML assertionにemailが必要だよ、などの情報
  • Certificantes
    • 証明書はアサーションの署名を検証するために使用され、データが信頼できることを確認する
tkrytkry

たしかになんとなくOAuthっぽい仕組みにも感じる

tkrytkry

OAuthは認可だし暗号化も行われないけど柔軟、SSOに使えない
SAMLは認証認可につかえるし大規模で暗号化されたデータ、SSOに使える

ちょっと用途が違うものらしい

tkrytkry
tkrytkry

OIDCは認可だけではなく認証を行えるようにした拡張使用なんだって

tkrytkry

わかりやすい

OIDC と OAuth の関係を一言で言うと、以下のような式で書くことが出来ます。
OIDC = OAuth + IDトークン + UserInfoエンドポイント

tkrytkry

CSRF攻撃を防止するためにstateパラメータを使うらしい

tkrytkry

zennのほうはGoogle、とほほはCognitoでのOIDC実装の例だった

このスクラップは2日前にクローズされました