Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.

Commit fc7a36f

Browse files
committed
auth
1 parent 185f82b commit fc7a36f

File tree

1 file changed

+152
-0
lines changed

1 file changed

+152
-0
lines changed

books/auth0-guide.md

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# 認証サバイバルガイド by Auth0
2+
3+
## コンセプト
4+
5+
- 認証
6+
- 人物のアイデンティティを特定するプロセス
7+
- 認可
8+
- 人物が権限を持っているかを判断するプロセス
9+
- アイデンティティプロバイダ
10+
- アイデンティティ情報を作成、維持、および管理するエンティティ
11+
- e.g. Google, Facebook, Github
12+
- デジタル署名
13+
- 改ざんがないことを保証するための技術
14+
- e.g. 「これは間違いなく Google が作ったデータだな」
15+
- フレームワークとプロトコル
16+
- フレームワーク=>仕様のみ
17+
- プロトコル=>仕様と実装
18+
19+
## OAuth 2.0
20+
21+
- **認可**のための**フレームワーク**
22+
- HTTP ベースのリソース(≒REST API)へのアクセス権(認可)を取得できるようにするためのもの
23+
- ユーザ認証は OAuth の目的ではない
24+
- アクセストークンを発行する
25+
- パスワード等のクレデンシャルの共有が不要
26+
- 登場人物
27+
- 認可サーバー
28+
- e.g. Google の認証サーバー
29+
- クライアントアプリケーション
30+
- e.g. アプリ A
31+
- リソースオーナー
32+
- アプリ A のユーザー
33+
- リソースサーバー
34+
- アプリ A のコンテンツサーバーなど
35+
- 余談
36+
- 誰が API を呼び出しているか知りたいだけなら、OAuth2 じゃなくても、API キーを使うだけで事足りる場合もあるので検討してみてね
37+
- 認可サーバを自前で実装しようなどというバカな試みはやめておけ
38+
39+
## OpenID Connect
40+
41+
- **認証**のための**プロトコル**
42+
- ユーザ認証という特定の問題の解決に初めから重点を置いている
43+
- ID トークンを発行する
44+
- OAuth2 の曖昧な部分をはっきりさせている。例えば:
45+
- OAuth2 ではトークンのフォーマットは規定されていないが、OpenID Connect では JWT と規定されている
46+
- ユーザ情報を提供するための UserInfo エンドポイントについて規定されている
47+
- まだ新しく発展途上である
48+
49+
## エンタープライズプロトコル
50+
51+
- 企業内の問題は Active Directory などで解決してきたものの、
52+
- ネットワークの外にあるアプリのために、SAML と WS-Federation という 2 つのプロトコルが作られた
53+
54+
### SAML
55+
56+
- 異なるドメインをまたがるウェブブラウザベースの SSO
57+
- 2 つのシステム感で必要な Web のやり取りを定義している
58+
- 認証が済むと、真正性を検証可能な「トークン」が発行される
59+
- ややこしいが、SAML といったときには、SAML で定義されているトークンのフォーマットだけを指す場合がある
60+
- SAML のトークン部分だけが別のプロトコルで流用されることがある
61+
62+
### WS-Federation
63+
64+
- ウェブブラウザベースの SSO
65+
- `WS-***`というシリーズがいくつもあってどれもクソだが、その中でも FS-Federation はマシなプロトコル
66+
- 2 つのシステム感で必要な Web のやり取りを定義している
67+
- SAML よりもはるかにシンプル
68+
- トークンのフォーマットは事前に定義されていないが、多くの場合 SAML が使われる(ややこしい)
69+
70+
## 過去のプロトコル
71+
72+
過去のことは忘れて良い。互換性もまったくないし。
73+
74+
- OpenID 🪦
75+
- OpenID 2.0 🪦
76+
- OpenID Connect (現行)
77+
- OAuth 1.0a 🪦
78+
- OAuth 2.0 (現行)
79+
80+
## トークンについての詳細
81+
82+
- 参照によるトークン(by-reference)
83+
- Cookie ベースの認証
84+
- ユーザ情報をサーバ側で Lookup する必要がある
85+
- 値によるトークン(by-value)
86+
- JWT ベースの認証
87+
- 自己完結型トークンともいう
88+
- トークン自体にユーザ情報が含まれている
89+
90+
### トークンのフォーマット
91+
92+
- JWT
93+
- 自己完結型トークン
94+
- トークンにエンティティ(認証者)とトークンの対象(認証対象者)に関する情報が含まれている
95+
- ステートレスな認証システムを作ることができる
96+
- シンプル
97+
- 使用方法にある程度の柔軟性がある
98+
- トークンを表す方法が複数ある
99+
- 署名及び暗号化の方法を任意に選択できる、など
100+
- 一般的な構成
101+
- Base64url でエンコード
102+
- ヘッダ、ペイロード、署名などを HTTP で使いやすい方法で表す
103+
- 暗号化はしない(OAuth2 等の仕様において HTTPS が必須とされているうえ、トークンコンテンツがそもそも秘匿情報ではない)
104+
- SAML(トークンのフォーマットの話)
105+
- JWT の登場前はメジャーだった。今はオワコン
106+
- SOAP よりも HTTP がいい
107+
- XML よりも JSON がいい
108+
- SAML よりも JWT がいい
109+
110+
## トークンのタイプ
111+
112+
- アクセストークン
113+
- OAuth2 で定義されている
114+
- 認可サーバーによって発行され、リソースサーバーで利用される
115+
- 保護されたリソースにアクセスするためのクレデンシャル
116+
- アクセスできるか(権限)は知っているが、何にアクセスできるか(実際のコンテンツ)は知らない
117+
- 数分から数時間で失効する
118+
- フォーマットに要件はない
119+
- が、一般的には自己完結型トークンを使ってサーバへの追加呼び出しを減らすのがよい
120+
- アクセストークンをユーザ認証の手段として使うべきでない
121+
- アプリが脆弱になるため
122+
- ユーザの認証に使うトークンはすべて、そのトークンが特定のアプリケーションでの認証のために発行されたことを確認する方法を備えている必要がある
123+
- リフレッシュトークン
124+
- OAuth2 で定義されている
125+
- 認可サーバーでのみ利用される(発行&利用)
126+
- アクセストークンの再取得のために使う
127+
- 寿命は数年から無期限
128+
- 混乱ポイント「アクセストークンだけでよくね??」
129+
- だめ。なぜなら:
130+
- 認可サーバー側でアクセストークンを失効することができなくなるため
131+
- トークンが全てのリクエストに使われるので流出の機会が増えるため
132+
- ID トークン
133+
- OpenID Connetct で定義されている
134+
- JWT を使うことが義務付けられている
135+
- アクセストークンやリフレッシュトークンには、トークンフォーマットの規定はない
136+
137+
### トークンの保存
138+
139+
- 適切な方法でトークンを保存することは必須の要件
140+
- モバイルなら
141+
- 他のアプリがトークンにアクセスできないような場所に保存する
142+
- e.g. Android なら SharedPreferences 機能など
143+
- ブラウザなら
144+
- ローカルストレージ or セッションストレージ (← これらがおすすめ)
145+
- Cookie
146+
- 詳細は本文参照
147+
148+
### でも Cookie が好き
149+
150+
- Cookie が完全に時代遅れというわけではなく、役に立つ場面もある
151+
- やみくもに Cookie を嫌わないこと
152+
- ただし使うときは CSRF 対策、署名、暗号化などのセキュリティ対策はしっかりする

0 commit comments

Comments
 (0)