S3のアクセスコントロール
この辺、あるあるでややこしいポイントらしい

IAMによる認証と権限管理
これは一般的にサーバーサイドで使用され、S3 backetに対するアクセス権を制御する
IAMユーザーまたはIAMロールに適切なアクセスポリシーを付与し、必要なAPI操作(画像の取得など)を可能にします。
サーバーが画像データを取得して処理する必要がある場合、またはS3に対するアクセスを厳密に制御したい場合、IAMによる認証と権限管理を使用します。
2013年の記事
>IAMとBucketPolicyの違いはユーザ(クライアント)側に紐付いて権限が与えられるということです。
ACL
>2023年4月以降、Amazon S3は新しく作成されるバケットに対してデフォルトでS3Block Public Accessを有効にし、アクセスコントロールリスト(ACL)を無効にするようになりました。これらの設定は、バケットのセキュリティを自動的に強化するためのものです by 
2013年の記事
>ACLの設定はバケット、もしくはオブジェクト単位で設定する事が出来るのが特徴になっています。
_ユースケース | ACL | BucketPolicy | IAM |
一個のObjectを公開したい | ◯ | △ | △ |
バケット全体を公開したい | △ | ◯ | ◯ |
特定のユーザにだけ公開したい | △ | △ | ◯ |
IPアドレス制限をかけたい | ☓ | ◯ | ◯ |
Bucketの中のPrefixを指定して公開したい | △ | ◯ | ◯ |
prefixがユーザ毎に可変 | △ | △ | ◯ |
形式 | XML | JSON | JSON |
getSignedUrl
関数を使用して一時的にS3オブジェクトにアクセス可能なURLを生成する
clientで直接S3にアクセスする必要がある場合に便利
生成されたURLは有効期限があるものの誰でもアクセスできる
ユーザーがブラウザで直接S3の画像を見る必要があり、サーバーを介したくない場合は、署名付きURLを使用します。ただし、このURLが漏洩すると誰でも画像にアクセスできるため、注意が必要です。
直接バイナリデータを取得
getObject
メソッドを使用してS3から直接画像データを取得し、そのデータをHTTPレスポンスのボディとしてクライアントに送信します。これにより、画像データの取得は完全にサーバーサイドで制御され、クライアントは特定のAPIエンドポイントからデータを取得するだけになります。
クライアントが画像を取得するためには必ずサーバーを介するようにしたい場合、またはクライアントが直接S3にアクセスすることを避けたい場合は、直接バイナリデータを取得する方法を使用します。
Cognitoを使用する
一時的なAWS認証情報を生成
CloudFrontとS3の組み合わせ
特定のIP範囲からのアクセスのみを許可したり
意図せず機密情報が外部に漏れてしまうのを防ぐために気をつける
時代の流れ