ハードコーディングとは?変数や設定ファイルを使わず値を直書きする問題

システム開発・テクノロジー
ハードコーディングとは?ざっくりと3行で
  • 変更される可能性のある値(URLのドメイン名・APIキー・設定値・文字列など)を変数・設定ファイル・環境変数を使わずにソースコード内に直接書き込む実装方法のこと
  • コードを変更するたびに再デプロイが必要になり、本番・開発・テスト環境で同じ値を使い回せない・パスワードや秘密鍵がコードに含まれてセキュリティリスクになるなどの問題が生じる
  • 対義語は「ソフトコーディング」で、環境変数・設定ファイル・DBから値を取得することでコードを変えずに動作を変えられる柔軟な設計を目指すことが現代の開発の基本だ

【深掘り】これだけ知ってればOK!

ハードコーディングの典型的な問題を実例で理解しよう。コード内に直接 `const DB_HOST = ‘192.168.1.100’` と書いてしまうと、本番環境では別のIPアドレスを使いたいときに毎回コードを変更してデプロイし直す必要がある。またGitHubにコードをpushすると秘密鍵・APIキーが世界中に公開されてしまうリスクがある。

ハードコーディングを避けるための代表的な手法を整理しよう。環境変数:OSの環境変数に値を設定してコードから参照する(`process.env.DB_HOST`)。設定ファイル:`config.yaml`・`.env`ファイルに設定値を書いてコードから読み込む。シークレット管理サービス:AWS Secrets Manager・HashiCorp Vaultなどで機密情報を安全に管理する。定数・Enum:変更頻度は低いが複数箇所で使う値は定数として定義して一箇所で管理する。

APIキー・パスワード・秘密鍵のハードコーディングは特に危険だ。GitHubなどの公開リポジトリにpushした場合、Gitの履歴に残るためファイルを削除してもアクセスできてしまう。GitHub Actionsでは`secrets`として管理し、アプリケーション本体には`.env`ファイルで渡すなど機密情報をコードから分離する設計が必要だ。

ハードコーディングが特に問題になるのがマジックナンバーだ。`if (status === 3)` のように数値・文字列が意味不明なままコードに直書きされた状態で、`3`が何を意味するか他の開発者には分からない。`const STATUS_APPROVED = 3` のように定数で名前をつけることでコードの可読性と保守性が大幅に向上する。

チームで開発する場合、`.env`ファイルはGitの`.gitignore`に追加してリポジトリに含めないようにする。`.env.example`という値が空のサンプルファイルだけをコミットして、各開発者が自分の環境に合わせた値を設定する運用が標準的だ。

よくある誤解

ハードコーディングは開発時だけなら問題ないと思っている

開発時のハードコーディングが本番環境にそのまま流れてしまうリスクがある。また一度コードに書かれた値はGitの履歴に残り続けるため、後からコードを公開した際に過去のコミットから機密情報が流出するリスクがある。最初から適切な設計をすることが重要だ。

.envファイルに書けばハードコーディングではないから安全だと思っている

.envファイルは環境変数を管理する適切な手法だが、.envファイル自体をGitにコミットしてしまうと意味がない。必ず.gitignoreに.envを追加してGit管理外にすることが必須だ。チームで共有が必要な場合はAWS Secrets ManagerなどのSecrets管理サービスを使う。

会話での使われ方

ITKAGYO運営者デプロイ太郎のアイコン画像

このコードにAPIキーが直書きになっています。GitHubにpushしたら世界中に公開されます。今すぐ環境変数に移してコミット履歴もrebaseしてください。

コードレビューでシニアエンジニアが深刻なセキュリティリスクを発見して緊急対応を指示している場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

if (type === 2)の2って何ですか?マジックナンバーは定数で名前をつけてください。

コードレビューでコードの可読性の問題を指摘している場面。マジックナンバーの撲滅を求めている。

ITKAGYO運営者デプロイ太郎のアイコン画像

本番と開発で違うAPIエンドポイントを使いたいんですが。.envファイルでAPI_URLを環境ごとに設定すれば、コードを変えずに切り替えられますよ。

バックエンドエンジニアが環境ごとの設定切り替えの方法を後輩に教えている場面。

【まとめ】3つのポイント

  • 変更される値をコードに直書きせず環境変数・設定ファイルで管理する:ハードコーディングを避けることで環境ごとの設定切り替えが容易になりコードを変えずに動作を変えられる柔軟で保守しやすい設計が実現できる
  • APIキー・パスワードは絶対にコードに書かずSecrets管理サービスを使う:機密情報のハードコーディングはGitにpushした瞬間に公開リスクがあり履歴にも残るため環境変数・AWS Secrets Manager・HashiCorp Vaultで厳格に管理する必要がある
  • マジックナンバーは定数に名前をつけてコードの可読性を高める:意味不明な数値や文字列をコードに直書きするマジックナンバーは定数として名前をつけることでコードの意図が明確になり保守性と可読性が大幅に向上する

よくある質問

Q
ハードコーディングとソフトコーディングの違いは何ですか?
A

ハードコーディングは値をコードに直接書き込む方法で、変更のたびにコードを編集してデプロイが必要です。ソフトコーディングは環境変数・設定ファイル・DBから値を取得する方法で、コードを変えずに値を変えられる柔軟な設計です。

Q
GitHubに間違えてAPIキーをpushしてしまった場合はどうすればいいですか?
A

まずすぐにそのAPIキーを無効化して新しいキーを発行してください。Gitの履歴からの削除はgit filter-branchやBFG Repo Cleanerで行いますが、公開リポジトリの場合はすでに第三者に取得されている可能性を前提に対応してください。

Q
環境変数はどこに設定すればいいですか?
A

ローカル開発では.envファイル、本番環境ではサーバーのOS環境変数・AWSのSystems Manager Parameter Store・Secrets Manager・DockerやKubernetesのSecrets・GitHub ActionsのSecretsなど実行環境に応じた方法を使います。

Q
.gitignoreとは何ですか?
A

Gitがバージョン管理の対象から除外するファイル・ディレクトリを指定するファイルです。.envや機密情報を含むファイルをここに記載することでGitにコミットされないよう保護します。

この用語と一緒に知っておきたい用語

用語 この記事との関連
コーディング コーディングを押さえると本記事の理解がさらに深まります。コーディングの主要な特徴と用途を理解することで、関連する技術・制度・概念を正確に把握できるようになる
GitHub GitHubは関連分野でよく登場する重要キーワードです。Gitリポジトリをクラウドでホスティングしプルリクエスト・コードレビュー・CI/CD(GitHub Actions)・プロジェクト管理を統合した世界最大の開発コラボレーションプラットフォームだ
コミット コミットは関連分野でよく登場する重要キーワードです。コミットというのは、プログラムの変更内容をここまでの作業としてまとめて記録する、バージョン管理の基本操作のことだよ。
可読性 次のステップとして可読性を学ぶと知識が広がります。可読性の主要な特徴と用途を理解することで、関連する技術・制度・概念を正確に把握できるようになる
GitHub Actions GitHub Actionsとの関係を知ると全体像がつかみやすくなります。GitHub Actionsの主要な特徴と用途を理解することで、関連技術の選定や会話での活用に役立てることができる

【出典】参考URL

https://12factor.net/ja/config :The Twelve-Factor App「設定」の考え方
https://docs.github.com/ja/actions/security-guides/encrypted-secrets :GitHub Actions Secrets
https://aws.amazon.com/jp/secrets-manager/ :AWS Secrets Manager

コメント

「IT用語、難しすぎて心が折れそう……」という方のための、ハードル低めな用語辞典です。

情報レベルは「基礎中の基礎」。会話を止めないためのエッセンスだけを抽出しています。分かりやすさを追求するあまり、時々例え話が暴走しているかもしれませんが、そこは「ほどよく」聞き流していただけると幸いです。
ほどよくIT用語辞典システム開発・テクノロジー
デプロイ太郎のSNSを見てみる!!