웹사이트 환경설정 파일과 비밀정보를 웹루트 밖에서 안전하게 관리하는 방법
웹루트 밖에 중요한 파일을 두면 안전하지만 관리측면에선 불편한 측이 있습니다. 웹서버 설정도 그렇고 하지만 초기 한번 설정 잘 하면 평생 잘 사용하는 방법 이기도 합니다.
요즘 .env 파일 github에 올려서 이것만 찾는 봇이 있을 정도 라고 하지요.
반드시 이 방식을 사용할 필요는 없는데 ... 작게 할일을 크게 하기도 하고. 정작 커졌을때는 그에 맞게 되어 있지 않고.
오래된 방식인데 요즘 이렇게 안 하시는 분들 많은듯 싶습니다.
웹서버를 통해서는 웹루트 밖에는 접근 자체가 안되는 방식이지만 백엔드 프로그램에선 접근해서 사용이 가능합니다.
웹서버와 PHP 같은 백엔드 프로그램을 동일시 보시는분들이 있던데 전혀 다른 것입니다.
웹사이트의 inc_config.php .env 데이터베이스 비밀번호 API 키 암호화 키와 같은 중요 정보는 외부에서 직접 접근할 수 있는 웹루트(DocumentRoot) 안에 두지 않는 것이 안전합니다.
예를 들어 웹루트가 다음과 같다면
/home/site/public_html/
환경설정 파일은 다음처럼 웹루트 밖에 둘 수 있습니다.
/home/site/config/inc_config.php
/home/site/config/.env
/home/site/secrets/password.php
/home/site/secrets/encryption.key
PHP에서는 필요한 파일을 절대경로 또는 상위 경로를 이용해 불러옵니다.
require '/home/site/config/inc_config.php';
▷ GitHub에서는 어떻게 관리해야 하나요?
GitHub 저장소에는 프로그램 소스만 저장하고 실제 비밀번호나 암호화 키는 올리지 않는 것이 좋습니다.
.gitignore에 다음과 같이 등록할 수 있습니다.
.env
inc_config.php
secrets/
*.key
대신 필요한 환경변수 이름만 들어 있는 .env.example 같은 샘플 파일을 GitHub에 저장합니다.
DB_HOST=
DB_NAME=
DB_USER=
DB_PASSWORD=
ENCRYPTION_KEY=
▷ 서버에 배포할 때는 어떻게 하나요?
GitHub에서 웹사이트 소스를 배포한 뒤 서버에 이미 준비해 둔 환경설정 파일과 비밀정보를 사용하도록 구성합니다.
즉
GitHub
└─ 프로그램 소스
↓ 배포
/home/site/public_html/
서버에서 별도 관리
/home/site/config/
/home/site/secrets/
와 같이 소스 배포와 비밀정보 배포를 분리하는 방식입니다.
운영 서버의 .env 비밀번호 파일 암호화 키는 GitHub에서 내려받는 것이 아니라 서버에서 별도로 생성하거나 배포 시스템의 Secret 기능을 통해 전달하는 것이 안전합니다.
▷ 비밀번호와 암호화 키도 분리해야 하나요?
가능하면 분리하는 것이 좋습니다.
데이터베이스 비밀번호 API 비밀번호 등의 인증정보와 데이터 암호화에 사용하는 암호화 키를 같은 파일에 모두 저장하면 하나의 파일이 노출되었을 때 피해 범위가 커집니다.
예를 들어 다음과 같이 관리할 수 있습니다.
/home/site/config/app.env
/home/site/secrets/password.php
/home/site/secrets/encryption.key
파일 권한도 웹서버 또는 필요한 사용자만 읽을 수 있도록 제한하는 것이 좋습니다.
▷ .env 파일을 웹루트 밖에 두는 이유는 무엇인가요?
.env와 환경설정 파일에는 데이터베이스 비밀번호 API 키 등 중요한 정보가 포함될 수 있습니다. 웹루트 밖에 저장하면 웹서버 설정 오류나 파일 노출 문제가 발생하더라도 브라우저를 통한 직접 접근 위험을 줄일 수 있습니다.
▷ GitHub와 운영 서버에서 비밀번호와 암호화 키를 가장 안전하게 관리하는 방법은 무엇인가요?
GitHub에는 실제 비밀정보를 저장하지 않고 소스 코드와 .env.example 같은 설정 예제만 관리합니다. 실제 비밀번호와 암호화 키는 운영 서버의 웹루트 밖이나 배포 시스템의 Secret Manager에 별도로 저장하고 애플리케이션이 실행될 때 필요한 값만 읽도록 구성하는 방식이 권장됩니다.
