シークレットは「見せてはいけない文字列」
開発をしていると、APIキーやパスワード、アクセストークンといった文字列を扱う場面が必ず出てきます。こうした「外に漏れると困る値」をまとめてシークレット(secret)と呼びます。日本語でいうと「秘密情報」「機密情報」ですね。
身近な例えでいうと、家の鍵に近いです。鍵そのものは小さな金属片でしかありませんが、それを持っている人は家の中の全部にアクセスできてしまう。だから鍵は玄関マットの下に置かないし、SNSに鍵の写真を上げたりもしません。APIキーもまったく同じで、たった数十文字の文字列なのに、それを知っている人は課金されるサービスを好きなだけ叩けたり、データベースの中身を読めたりします。
どんなものがシークレットにあたるか
初心者のうちは「これは秘密なのか、そうでないのか」の線引きがつかみにくいと思います。ざっくりした感覚としては、それ単体で誰かになりすませる値かどうかで考えるとわかりやすいです。
- 外部サービスのAPIキー・アクセストークン
- データベースの接続文字列(ユーザー名とパスワードを含むもの)
- SSHの秘密鍵、署名用の鍵
- 各種サービスのパスワード
逆に、公開されているエンドポイントのURLや、アプリの表示設定みたいな値は、漏れても直接的な被害にはつながりません。この「漏れたら誰かが自分のふりをできる値」が、守るべきシークレットです。
やってしまいがちな失敗
正直、最初は誰でも一度はやります。動かすのを急いで、ソースコードに直接キーを書いてしまうやつです。
// これはやってはいけない例
const apiKey = "sk-abcdefg1234567890";
ローカルで動かしている間は何も起きません。問題はこれをそのままGitにコミットして、リポジトリを公開したときです。コミット履歴は残るので、あとから「やばい」と気づいてコードを直しても、過去のコミットを辿れば鍵は読めてしまいます。「消したから大丈夫」が通じないのがシークレット漏洩の怖いところで、いったん外に出た鍵は作り直す(ローテーションする)しかないと考えたほうが安全です。
基本の守り方
定番のやり方は、シークレットをコードから切り離して、環境変数や設定ファイルとして外から渡すことです。
.envなどの別ファイルに書く.gitignoreでそのファイルを除外するこうしておくと、コードをそのまま共有してもシークレットはついてきません。チームで開発するときは、値を空にしたテンプレート(.env.exampleのような形)だけをリポジトリに置いて、「ここに自分のキーを入れてね」と伝える運用がよく使われます。
AIツールを使うときの注意
Claude Codeのように、ローカルのファイルを読んで作業を進めるAIツールを使う場合、シークレットの扱いには一段の注意が要ります。AIに読ませるファイルの中にキーが混ざっていれば、それはツール側に渡る情報になります。
また、AIが生成したコードにうっかりキーが直書きされていないか、コミット前に自分の目で確認する習慣をつけておくと安心です。「AIが書いたから大丈夫だろう」ではなく、シークレットまわりだけは人間が最後にチェックする、くらいの感覚がちょうどいいと思います。
覚えておきたい一言
シークレットは、扱いを間違えたときのダメージが他のバグと比べて桁違いに大きい部類の話です。バグは直せますが、漏れた鍵は取り消せません。逆にいうと、コードに書かない・Gitに載せないという2つを徹底するだけで、事故の大半は防げます。まずはここから習慣にしてください。
このページは役に立ちましたか?