@マークBは優れた点を作っています。私は彼の答えで何も論争していません。それにもかかわらず、私は会話に貢献したいと思います。
JWTがどこから来たのか、そして取得、使用、更新される方法によって、より具体的な回答が得られる可能性があります。カスタム承認者を使用すると、これらのシナリオでは意味をなさないことがありますが、認可のいくつかの異なる味の後ろに単一ラムダを確保したい場合は
ユースケース1人の
カスタム承認者に役立ちます。たとえば、3つの異なるAPIゲートウェイエンドポイントを作成して、それぞれ同じラムダを呼び出すが、別個の承認者を使用することができます。これは、DRYのメリットについてMarkの要点と関連しています。
ユースケース2人の
カスタム承認者は、あなたの承認者コードにインラインIAM権限を構築する能力を与えます。既存のIAMロールを発信者に割り当てるのではなく、好きな任意の権限セットを作成できます。何らかの形で(信頼できない)ユーザー入力を使用してIAM権限を割り当てていると、これは簡単に厄介な攻撃ベクトルになる可能性があることに注意してください。
ユースケース3
ラムダは、秘密を隠すための素晴らしいです。たとえば、フロントエンドのJSアプリがあり、クライアントIDとクライアントの秘密を必要とするOAuth 2.0のフローに参加する必要があります。または、ある種のAPIキーを必要とするエンドポイントを呼び出す必要があります。 明らかに、これらの秘密をブラウザに公開することはできません。
これらの値は、ラムダ関数に固有のencrypted and stored in environment variablesです。このアプローチをバックエンドラムダで確実に実行することができますが、代わりにオーソライザを使用すると、次のような利点があります。
私はこれらの秘密の範囲を可能な限り厳密に制限できるのが好きです。オーサライザを使用することで、私のアプリケーションはこれらの秘密を幸せに知らないままになります。これはマークのポイントに関心の分離に関するものです。
IAMと最小特権私は私のバックエンド・コードは、権限のない者によって呼び出されることは決してありませんことを好む
。このため、実際に作成するすべてのAPIゲートウェイリソースで、ある種の認可者を使用します。私はカスタムオーソライザを使用しましたが、私の最後の手段です。私は、Cognitoを使用して一時的なIAMクレデンシャルのトークンを交換することで、ほとんどの場合IAM認可を得ます。
認可者ではなく、バックエンドのラムダで認可を実行する場合、バックエンドラムダの周りにIAM contolを定義するときに制限を受けることはできません。これはprinciple of least privilegeの違反です。これは単なるコード構成とアプリケーションアーキテクチャの問題ではありません。正当なセキュリティ上の懸念事項です。基本的には、あなたがしなければならないより多くの攻撃面を露出しています。
さらに、バックエンドが大きくなるとIAMの真のパワーが光ります。バックエンドラムダは、S3への書き込み、他のLambdasの呼び出し、SNSまたはSQSへの公開、RDSまたはDynamoDBとの対話などが必要な場合があります。このアクセスのすべてが厳格なIAMによって管理されていることを「ベストプラクティス」ポリシー。私の経験上、これを達成する最も簡単な方法は、(必ずしもカスタムではない)APIゲートウェイ・オーソライザを使用してロールを割り当てることです。
良い点ですが、フラスコやファルコンのような多くのフレームワークでは、コードをDRYにするための事前要求フックが許可されています – Serge