認証についての知識がほぼゼロなので... #01

認証についての知識がほぼゼロだったので触る

現場でJWTという認証方式が採用されたので、ちょいとお勉強しておく

ざっくり

トークンベースの認証とは、ユーザーが自分のアイデンティティを確認し、代わりに一意のアクセストークンを受け取ることを可能にするプロトコルです。トークンの存続期間中、ユーザーはトークンが発行されたWebサイトやアプリにアクセスできます。同じトークンで保護されたWebページ/アプリ/リソースに再度アクセスするたびに、資格情報を再入力する必要はありません。

毎回、IDパスワードで認証する必要はありませんよ〜と

なんか検索してると「JWT 認証 使うな」とかでてくるが、
正直認証まわりの知識がゼロに近いので、メリットデメリットがよくわからない
ので一旦JWTを勉強する。
(なんかしらの脆弱性とかがあるのか?わからない...

とりあえずのざっくりイメージ

認証

  1. id / パスワードを受け取る
  2. id / パスワードを検証する
  3. アクセストークン / リフレッシュトークンを生成して返却 jwtのライブラリで生成
/**
 * Synchronously sign the given payload into a JSON Web Token string
 * payload - Payload to sign, could be an literal, buffer or string
 * secretOrPrivateKey - Either the secret for HMAC algorithms, or the PEM encoded private key for RSA and ECDSA.
 * [options] - Options for the signature
 * returns - The JSON Web Token string
 */
export function sign(
    payload: string | Buffer | object, // Claim??
    secretOrPrivateKey: Secret, // 秘密キー
    options?: SignOptions,  // なんやかんやのオプション
): string;

次回接続時

  1. アクセストークン / リフレッシュトークンを受け取る
  2. アクセストークン / リフレッシュトークンを検証する
    なんやかんやするらしい
/**
 * Synchronously verify given token using a secret or a public key to get a decoded token
 * token - JWT string to verify
 * secretOrPublicKey - Either the secret for HMAC algorithms, or the PEM encoded public key for RSA and ECDSA.
 * [options] - Options for the verification
 * returns - The decoded token.
 */
export function verify(token: string, secretOrPublicKey: Secret, options: VerifyOptions & { complete: true }): Jwt | string;
export function verify(token: string, secretOrPublicKey: Secret, options?: VerifyOptions): JwtPayload | string;

デコードされたものが返却される、この時返されるのが、生成時に使用したpayload: string | Buffer | object, // Claim??

3.アクセストークンが期限切れの場合、リフレッシュトークンを検証するらしい(この辺はまた後で調べる必要ありそう

4.なんやかんや新しく生成されたトークンを返却する

アクセストークンが期限切れの場合

アクセストークン / リフレッシュトークンを再生成する

アクセストークンが期限切れではない場合

受け取ったアクセストークン / リフレッシュトークンをそのまま返却する

大まかな流れはこんなところ?

クライアント側の動きがよくわからないので、次はそのあたり