Vì git giữ lịch sử vĩnh viễn: một khi secret vào commit, nó còn nằm đó kể cả sau khi bạn xoá file ở commit sau. Repo private cũng không an toàn — chỉ cần một lần chuyển sang public, một fork, một bản clone trên máy nhân viên cũ là secret đã ra ngoài.
Cách làm chuẩn:
- .env nằm trong .gitignore; commit .env.example chỉ chứa tên biến, không chứa giá trị.
- Dev: mỗi người tự tạo .env local, dùng credential của môi trường dev — không bao giờ dùng key production.
- CI: secret nằm ở kho secret của CI (GitHub Actions secrets, GitLab CI variables), inject vào lúc chạy qua biến môi trường.
- Production: platform env vars (Vercel, Railway) hoặc secret manager chuyên dụng (AWS Secrets Manager, HashiCorp Vault) — nơi có phân quyền và audit log.
Bật thêm secret scanning + push protection trên repo để chặn ngay lúc push, và một hook gitleaks/git-secrets ở local. Phòng ở khâu commit rẻ hơn nhiều so với đi rotate cả cụm key sau sự cố.