배포 순간이 가장 위험하다
개발 환경에서는 문제없던 설정이 프로덕션에서 보안 구멍이 되는 경우가 많다. 디버그 모드 켜진 채 배포, .env 파일 포함, HTTPS 미설정 — 모두 배포 직후 5분 안에 잡을 수 있는 문제다.
CodeScan에서 신규 배포 사이트 100개를 점검한 결과, 62%가 배포 첫날에 보안 취약점을 가지고 있었다. 대부분 아래 8가지 중 하나였다.
1. 디버그 모드 꺼졌는지 확인
Django DEBUG=True, Next.js 개발 모드, Flask 디버그 모드. 에러 발생 시 소스코드, DB 쿼리, 환경변수가 에러 페이지에 노출된다. 배포 후 일부러 404나 500 에러를 발생시켜서 디버그 정보가 나오는지 확인한다.
2. 환경변수 파일 접근 차단
yourdomain.com/.env를 브라우저에서 직접 접속해본다. 다운로드되면 DB 비밀번호, API 키가 전부 노출된 것이다. .gitignore에 넣는 것과 웹서버에서 차단하는 것은 별개다.
3. HTTPS 강제 리다이렉트
http://로 접속했을 때 https://로 자동 리다이렉트되는지 확인한다. 리다이렉트 없이 HTTP로 접속 가능하면 로그인 정보, 쿠키가 평문으로 전송된다.
4. 보안 헤더 설정
X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, Content-Security-Policy. 이 4개 헤더가 없으면 XSS, 클릭재킹, MIME 스니핑 공격에 노출된다. 브라우저 개발자 도구 Network 탭에서 응답 헤더를 확인한다.
5. 기본 관리자 경로 변경
/admin, /wp-admin, /dashboard 같은 기본 경로를 그대로 쓰면 자동화 공격의 첫 번째 타깃이 된다. 관리자 페이지 경로를 변경하고, IP 제한이나 2FA를 추가한다.
6. 에러 페이지에서 정보 유출
존재하지 않는 URL에 접속했을 때 서버 정보(Apache/2.4.41, Python/3.12)가 노출되는지 확인한다. 커스텀 404/500 페이지를 설정하고, 서버 버전 정보를 응답 헤더에서 제거한다.
7. 쿠키 보안 속성
로그인 후 브라우저 개발자 도구에서 쿠키를 확인한다. Secure, HttpOnly, SameSite 속성이 설정되어 있는지 체크한다. 하나라도 빠지면 세션 탈취 위험이 있다.
8. 불필요한 포트 차단
80, 443 외에 열려 있는 포트가 있는지 확인한다. DB 포트(3306, 5432), Redis(6379)가 외부에 열려 있으면 직접 접속 시도가 가능하다.
8가지를 한 번에 확인하는 방법
위 항목을 하나씩 수동으로 확인하는 대신, URL 하나로 자동 점검할 수 있다. 보안 헤더, SSL, 포트, 환경변수 노출까지 17개 항목을 30초 만에 스캔한다.