DanLevy.net

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

公開?非公開?何?

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

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

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

1 つのミスでサーバーとデータの制御がハッカーに奪われる可能性があります!

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

しばしば、目にするさまざまな用語――tokenskeyscredentialssecretsprivatepublic――が混乱を招きます。

これらを secretnon‑secret の二分に置き換えて考えましょう。



🔒 Secret keys

** ‼️ Important:** Secret keys MUST be ignored by Git AND omitted in all browser code. How to use dotenv


Secret key を扱っているかどうかは、どうやって判断しますか?


👍 Rule-of-thumb: CORS errors を返すサーバーはブラウザから直接呼び出せません。これは MUST プロキシを経由させ、secret と同様に扱うべきであることを強く示しています。

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

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


使用例と機能: Secret キー

Checklist: Handling Secrets Safely

Quick Overview

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

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/テスト、機能フラグ、特定環境向けのランタイム設定などがあります。