DanLevy.net

トークン、APIキー、シークレットの保護

公開?非公開?何?

Hero image for トークン、APIキー、シークレットの保護

トークンを保護すべきタイミングは?

API キーやトークンの保護は 極めて重要 です!

たった一つのミスで、サーバーやデータの制御権がハッカーに奪われます!

公式ドキュメントを参照すれば、特定のトークンを隠すべきかどうかを判断するのはそれほど難しくありません。

しかし、tokens, keys, credentials, secrets, private, public といった関連用語が混在すると、状況はさらに複雑になります。

ここでは secretnon-secret に分類して考え直しましょう。



🔒 Secret keys

** ‼️ 重要:** Secret keys は Git から 除外 され、ブラウザコードにも 含めてはいけませんdotenv の使い方


「Secret key」かどうかはどうやって判断するのか?


👍 経験則: CORS エラー を返すサーバーはブラウザから直接呼び出せません。これはそのサービスを プロキシ すべきであり、secret と同様に扱うべきことを強く示唆します。

👍 経験則: コストがかかるサービスは (ほぼ) 常にプロキシ化または隠蔽すべきです。

👍 経験則: 書き込み操作(ファイルアップロード、DB 行の挿入)を行う場合、secret keys を扱っている可能性があります。


利用ケースと特徴: Secret キー

チェックリスト: シークレットの安全な取り扱い

クイック概要

以下の手順を実行して コードからシークレットを排除 してください。

DON’T デプロイ先サーバーで .env ファイルを作成しないこと。ホスティングサービス(例: Heroku、Netlify、AWS EC2)で提供されている環境変数管理ツール(ダッシュボードまたは CLI)を利用してください。

Related Article: Using dotenv securely in NodeJS


🌍 Non-secret keys

👍 経験則: キーをコードやインラインでブラウザに送る必要がある場合(例: <script src="https://my-api/?apiKey=123-abc-456"> タグ)、それは確実に non-secret です。典型的な例として Google Maps が挙げられます。


利用ケースと特徴: Non-secret キー

✅ 非シークレットの取り扱い:

非シークレット(公開)キーはハードコードしても安全です!

長期的に管理しやすくするため、アプリ全体で共有する config.js を用意します。

例:

config.js
module.exports = {
googleMapsKey: '123-abc'
};
load-map.js
const config = require('./config.js');
const key = config.googleMapsKey;
const src = `//maps.googleapis.com/maps/api/js?key=${key}`;
// ...

注: 環境変数の他の ユースケース もあります。ここで取り上げていないものとしては、CI/CD/テスト、機能フラグ、特定環境向けのランタイム設定などがあります。