APIキーを配置する場所:カスタムHTTPヘッダーとカスタムスキームを使用したAuthorizationヘッダー


17

APIキーを介した承認/認証を使用してREST APIを設計しています。

最適な場所を見つけようとしましたが、次のようなカスタムHTTPヘッダーの使用を多くの人が提案していることがわかりましたProjectName-Api-Key

ProjectName-Api-Key: abcde

ただしAuthorization、カスタムスキームでヘッダーを使用することも可能です。

Authorization: ApiKey abcde

一方、カスタム認証スキームは、一部のクライアントでは予期せずサポートされず、カスタムコードにつながる可能性があるという考慮事項を見つけました。したがって、クライアントには期待がないため、カスタムヘッダーを使用する方がよいでしょう。

どの方法でAPIキーを送信しますか?


私の指導のもとでのプロジェクトはAuthorization: Bearer <token>ヘッダーを使用しており、それに関する問題は一度もありませんでした。トークンはJWTです。
アンディ

1
@DavidPacker私が理解するように、BearerスキームはoAuth2でのみ使用されます。oAuthとは別に適用すると、誤用されているように聞こえます。oAuthがない場合にこのスキームを使用するのが正しいのはなぜですか?ところで、APIの承認の種類を選択するのに苦労しました。APIは1つの信頼できるサービスでのみ使用できるため、oAuth2のクライアント資格情報フローを調査しましたが、私の場合はApiKeyと比較して利点が見つかりませんでした。
RomanG

@DavidPackerそれから、名前ApiKeyが変更されAccess Token、有効期限なしでクライアントに付与されたものとして解釈された場合、ApiKey承認は有効なoAuth実装と見なすことができることを理解しました。それは一種の哲学的側面であり、私の場合を簡単な言葉で説明できるなら複雑な定義を持ち込まないことにし、単に「ApiKey」と呼ぶことにしました。プロトコルがoAuth標準を実装している場合、の使用に同意できますBearerが、そうではありません。このスキームは適用できないと思います。
RomanG

2
あなたは自分自身を制限しすぎています。APIコンシューマーは、OAuthを実装しているかどうかを気にする必要はありません。彼らが気にするのは、トークンの安全性、トークン発行が機能し、適切に認証されることです。JWTドキュメントでBearerを使用することをお勧めします。JWTはBearerスキーマに完全に適合しており、JWTをこれ以上推奨できませんでした。データベースにアクセスしなくてもユーザーを認証できるため、トークン失効機能が必要な場合を除き、RESTアプリケーションに最適です。
アンディ

1
(による駆動)... APIキーがあることを知っているように気をつけてください共有秘密 一般的に構成された依存者と身元または承認を通信するためではないオーセンティケータ、の間で共有。別の言い方をすれば、認証結果を表すのではなく、セキュリティハンドシェイクを開始することのみを目的としています。APIキーは、システムの信頼できる認証システムに対して自分自身を識別する権限を伝えます。安全なリソースへのアクセスを制御するためのトークンとしてキーを使用することは悪いジュジュある
K.アラン・ベイツ

回答:


11

承認を使用する場合、一貫性を保つ

次のものは不要であると主張する人もいます(そして、さほど昔ではありませんでした)。しかし、最近では、Authorizationヘッダーを使用する場合、APIキー自体が自己記述的ではないため、トークンのタイプを通知する必要があります 1

なぜそれが必要だと思うのか、なぜそれが重要だと思うのですか?最近では、さまざまな認証/承認プロトコルをサポートすることが必須になっているためです。Authorizationこれらすべてのプロトコルにヘッダーを使用する場合、認証サービスの一貫性を保つ必要があります。どの種類のトークンを送信するか、どの承認プロトコルを適用するかを通信する方法は、ヘッダーにも含める必要があります。

Authorization: Basic xxxx
Authorization: Digest xxxx
Authorization: Bearer xxxx
Authorization: ApiKey-v1 xxxx
Authorization: ApiKey-v2 xxxx

以前はこれを気にしませんでしたが、更新が保証されていないアプリクライアントアプリ(モバイルとセンサーがほとんど)を使用した後、始めました。クライアントをいじったり、サーバー側にあまり苦痛を与えたりせずにセキュリティを拡張できるように、セキュリティの実装方法にもっと慎重になり始めました。

懸念事項

自分のスキームを実装する際に直面した問題は、コメントされたものと似ています。

一方、カスタム認証スキームは予期せず、一部のクライアントではサポートされず、とにかくカスタムコードにつながる可能性があるという考慮事項を見つけました

セイのクライアントは、ライブラリ、フレームワーク、言うリバースプロキシを

長所

1つの重要な利点はキャッシュです。共有キャッシュは、特に断りのない限り、ヘッダーをキャッシュしません(もちろんそれは良いことです)。

承認またはカスタムヘッダーですか?

私の経験では、独自のAuthorizationスキームを実装すると、カスタム認証ヘッダーを実装するよりも非常に同じ量(またはそれ以上)の作業が必要になりますが、カスタムヘッダーを使用した場合、設計の自由度が高くなり、キャッシュをより制御できるというわずかな違いがあります。その理由はかなり愚かで、ほとんどの場合、またはにCache-control設定し ているので、ネットワークのトポロジに関係なく、サーバーへの呼び出しをより確定的にすることができます(これは追跡とテストに関して重要です)。no-cacheno-store


1:APIキーに関してこの回答が非常に明確であると思います


4
の使用はX-2012年から非推奨です:stackoverflow.com/a/3561399/923720
Darkhogg

1
オプス!知りませんでした。編集および修正。
ライヴ

この質問の前に、私はほとんどの人がURLにAPIキーを入れると思っていましたが、HTTPSを使用してそれを隠していました。いくつかの代替案を見るのは良いことです。たとえば、Contentful認可を許可またはクエリpamameter contentful.com/developers/docs/references/content-delivery-api/...
user949300

1
@ user949300 ...暗号化された共有シークレット(たとえばsslを介したuriのapiキー)を使用することは、まったく何もしないよりも明らかに安全ですが、インターセプトされ、IDに対する粒度が提供されない場合、簡単になりすまします。信頼関係者間で共有シークレットと、その共有シークレットで動作することを許可されたホワイトリストに登録されたマシンIDを一致させるマシン間通信以外にapi_keysを使用したことはありません。Machine to Machine Connが作成された後、人間のオペレーターは他の手段を使用して認証します。
K.

@K。Alan Bates私のAPIインタラクションのほとんどは、無料のジオコーディング層、天気予報などの比較的「重要ではない」ものであり、APIキーは深刻なユーザーシークレットよりもレート制限のためのものです。したがって、OPに関しては、必要なセキュリティのレベルに依存します。
user949300
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.