Upgrade to Pro — share decks privately, control downloads, hide ads and more …

年700万円損するサーバレスの 認可システムをご紹介します!!

higuuu
August 04, 2022

年700万円損するサーバレスの 認可システムをご紹介します!!

認証はAuth0、認可するAPIはAWSを使った時にコスト面でのアンチパターンについて紹介します。

higuuu

August 04, 2022
Tweet

More Decks by higuuu

Other Decks in Technology

Transcript

  1. 年700万円損するサーバレスの

    認可システムをご紹介します!!
     
    樋口修也

    View full-size slide

  2. スピーカー
    フロントエンド,認証認可
    2019年 東京のIT企業に新卒入社
    2020年 コープさっぽろへ転職し札幌へ
    2022年 情報安全確保支援士
    ダブルダッチ,ダンス,筋トレ
    暗号技術入門(結城浩)
    樋口修也(25)
    担当:
    経歴:
    趣味:
    愛読書:

    View full-size slide

  3. 聞いたことはあるはず?
    認証・認可とは何か?

    View full-size slide

  4. 定義: 認証・認可とは
    ● 認証とは
    ○ 端末の使用者が誰であるかを明確にすること
    ■ トークンを発行すること
    ● 認可とは
    ○ 誰に何をして良いかを署名の検証等を用いて確認すること
    ■ トークンの検証を行うこと
    ※OAuth2.0における厳密な定義は RFC6749 をご参照ください

    View full-size slide

  5. 認証のフロー
    トークン取得
    認証
    パスワードレス認証
    1.メール
    アドレス入力
    2.メールに
    確認コード送信
    3.確認コード
    入力
    メールアドレ
    スの所持情
    報の確認

    View full-size slide

  6. 認可のフロー
    トークン取得
    Auth0
    公開鍵
    API
    検証
    {
    Auth0上の
    ユーザー情報
    }
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    Base64
    エンコード
    認証
    user_id
    トークン(jwt)を認可する時の
    典型パターン

    View full-size slide

  7. 認可の最大のポイント
    トークン取得
    Auth0
    公開鍵
    API
    検証
    {
    Auth0上の
    ユーザー情報
    }
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    Base64
    エンコード
    認証
    user_id
    このユーザーIDをどこ
    から取得するか?

    View full-size slide

  8. ✖クライアントからuser_idを渡す
    トークン取得
    Auth0
    公開鍵
    API
    検証
    {
    Auth0上の
    ユーザー情報
    }
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    Base64
    エンコード
    認証
    user_id
    トークンさえ手に入れ
    ば誰にでもなり済ます
    ことができてしまう
    post
    {
    user_id:xxx
    }
    post
    {
    user_id:xxx
    }
    {
    user_id:yyy
    }

    View full-size slide

  9. ◯ Auth0から付与されるuser_idを使う
    トークン取得
    Auth0
    公開鍵
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:xxxx
    }
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:xxx
    } Base64
    エンコード
    認証
    user_id
    トークンを改竄した場
    合、署名の検証で弾
    かれるのでなり済ま
    すことができない
    {
    user_id:yyy
    }
    トークンを発行した相
    手を確かめることで、
    「誰に何をして良い
    か」制御できる

    View full-size slide

  10. 課題: Auth0から付与されるuser_idを使う
    トークン取得
    Auth0
    公開鍵
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:xxxx
    }
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:xxx
    } Base64
    エンコード
    認証
    user_id
    DB上でAuth0のユー
    ザーIDがキーになっ
    ている必要がある

    View full-size slide

  11. 課題: 異なるuser_idの具体例
    トークン取得
    Auth0
    公開鍵
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    }
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } Base64
    エンコード
    認証
    user_id: 078562
    レガシーシステムを
    Auth0へマイグレー
    ションした場合レガ
    シーなシステムの
    user_idが必要
    レガシーシステム
    のuser_idとAuth0
    のuser_idの紐付
    きが課題

    View full-size slide

  12. 課題: 複数APIあるとレガシーidの管理が大変
    トークン取得
    ZZZ事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } Base64
    エンコード
    認証
    user_id: 078562
    YYY事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } DB
    user_id: 078562
    XXX事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } DB
    user_id: 078562
    各DBに紐付きテーブ
    ルを持たせると変更
    時に全部更新する必
    要がある
    user_id: 099568
    user_id: 099568
    user_id: 099568

    View full-size slide

  13. △ 認可専用のAPIを作成する
    トークン取得
    Auth0
    公開鍵
    API
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } Base64
    エンコード
    認証
    認可用
    API
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    }
    検証
    DB
    {
    auth0_id:e4ak8,
    user_id: 078562
    }
    {
    user_id: 078562
    }
    user_id: 078562

    View full-size slide

  14. 課題: 認可APIの集中負荷
    トークン取得
    Auth0
    公開鍵
    XXX事業部
    API
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } Base64
    エンコード
    認証
    認可用
    API
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    }
    検証
    DB
    {
    auth0_id:e4ak8,
    user_id: 078562
    }
    user_id: 078562
    YYY事業部
    API
    ZZZ事業部
    API
    リクエスト毎にAPI
    を飛ばすので負荷
    が集中

    View full-size slide

  15. 認可APIコスト計算
    トークン取得
    Auth0
    公開鍵
    XXX事業部
    API
    認可
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    } Base64
    エンコード
    認証
    認可用
    API
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    }
    検証
    DB
    {
    auth0_id:e4ak8,
    user_id: 078562
    }
    user_id: 078562
    YYY事業部
    API
    ZZZ事業部
    API
    想定コール数: 10億 (月間)
    API Gateway
    予測費用: 468,250円
    計算式: 想定コール数/計算単位*コスト($)*ドル円変換
    (300,000,000/1,000,000*4.25*125+
    700,000,000/1,000,000*3.53*125)
    Lambda
    予測費用: 25,000円
    計算式: 想定コール数/計算単位*コスト($)*ドル円変換
    1,000,000,000/1,000,000*0.2*125
    ※メモリは省略
    その他(Cloudwatch,DynamoDBなど)
    予測費用: 97,650円
    計算式: APIgateway+Lambdaの予測費用*0.2
    月間予測費用: 590,900円
    年間予測費用: 7,090,800円

    View full-size slide

  16. 認可APIコスト計算
    Auth0
    公開鍵
    XXX事業部
    API
    認可
    DB
    認証
    認可用
    API
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8
    }
    検証
    DB
    {
    auth0_id:e4ak8,
    user_id: 078562
    }
    user_id: 078562
    YYY事業部
    API
    ZZZ事業部
    API
    認可APIをなくすことが
    できれば丸っとこれを
    削除することができる
    700万円/年

    View full-size slide

  17. ◯ Auth0上のmetadataにレガシーidも持たせる
    トークン取得
    認可
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    認証
    ZZZ事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    DB
    user_id: 078562
    Auth0
    公開鍵
    改ざん防止もでき、
    認可APIも不要とな

    View full-size slide

  18. ◯ 複数APIもOKかつid変更一括対応可能
    トークン取得
    ZZZ事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    DB
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    認証
    user_id: 078562
    YYY事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    DB
    user_id: 078562
    XXX事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    DB
    user_id: 078562
    id変更時にこ
    こを更新すれ
    ばいい

    View full-size slide

  19. ◯ トークン(jwt)の認可は各APIでできるようにするとお得
    トークン取得
    認可
    eykihidjfrkovki.eyujioknchuj
    glvpjnadfdtgdddfadcvdfgdaf
    edfertgajkhhijdkaihio.ikhhbk
    cjjkkfunmgloj
    署名
    ヘッダー
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    認証
    ZZZ事業部
    API
    検証
    Auth0上の
    ユーザー情報
    {
    user_id:e4ak8,
    mebber_id: 078562
    }
    DB
    user_id: 078562
    Auth0
    公開鍵
    認可専用のAPIを
    作ってしまうとそこの
    コストと保守工数が
    発生してしまう

    View full-size slide