Security

웹 보안 체크리스트

웹 애플리케이션 보안을 위한 필수 점검 항목을 확인하세요. · 2025.02 기준

전체 진행률
0%
0 / 47 항목 완료
인증/인가0/9
입력 검증0/8
데이터 보호0/7
서버 설정0/8
API 보안0/7
배포/운영0/8
강력한 비밀번호 정책 적용

최소 8자 이상, 대소문자/숫자/특수문자 조합을 요구하는 비밀번호 정책을 적용해야 합니다. 사전 단어나 연속 문자열을 차단하는 규칙도 포함하세요.

확인 방법:회원가입 및 비밀번호 변경 폼에서 약한 비밀번호를 입력하여 정책이 올바르게 적용되는지 확인합니다.
다중 인증(MFA) 지원

OTP, SMS, 인증 앱 등을 활용한 다중 인증을 제공하여 계정 탈취 위험을 줄여야 합니다. 관리자 계정에는 필수로 적용하세요.

확인 방법:관리자 및 일반 사용자 계정에서 MFA 등록/해제 및 로그인 시 2차 인증 동작 여부를 테스트합니다.
안전한 세션 관리

세션 ID는 충분히 길고 랜덤해야 하며, 로그인 후 세션 ID를 재발급(세션 고정 공격 방지)해야 합니다. 비활성 시 자동 만료도 설정하세요.

확인 방법:로그인 전후 세션 ID 변경 여부를 확인하고, 일정 시간 비활성 후 세션 만료가 정상 동작하는지 검증합니다.
비밀번호 안전 저장 (해시+솔트)

비밀번호를 평문이 아닌 bcrypt, argon2 등의 안전한 해시 알고리즘과 솔트를 적용하여 저장해야 합니다.

확인 방법:데이터베이스에서 비밀번호 필드를 확인하여 해시 형태로 저장되는지, 동일 비밀번호라도 솔트로 인해 다른 해시값이 생성되는지 검증합니다.
로그인 시도 횟수 제한

무차별 대입 공격을 방지하기 위해 일정 횟수 이상 로그인 실패 시 계정 잠금 또는 지연을 적용해야 합니다.

확인 방법:잘못된 비밀번호로 연속 로그인을 시도하여 임계값 초과 시 계정 잠금이나 캡차가 표시되는지 확인합니다.
권한 검증 (수평/수직 접근 제어)

다른 사용자의 리소스에 접근하거나 권한 없는 기능을 실행할 수 없도록 서버 측에서 권한을 검증해야 합니다.

확인 방법:일반 사용자 계정으로 관리자 전용 API를 호출하거나, 다른 사용자의 데이터 ID로 접근을 시도하여 차단되는지 확인합니다.
안전한 비밀번호 재설정 프로세스

비밀번호 재설정 토큰은 충분히 랜덤하고 유효 기간이 짧아야 하며, 사용 후 즉시 무효화해야 합니다.

확인 방법:비밀번호 재설정을 요청하여 토큰의 유효 기간, 일회성 사용 여부, URL 추측 불가능 여부를 확인합니다.
로그아웃 시 세션 완전 무효화

로그아웃 시 서버 측 세션을 완전히 삭제하고, 관련 쿠키도 제거하여 세션 재사용을 방지해야 합니다.

확인 방법:로그아웃 후 이전 세션 쿠키를 사용하여 인증이 필요한 페이지에 접근을 시도하여 차단 여부를 확인합니다.
민감 작업 시 재인증 요구

비밀번호 변경, 결제 등 중요한 작업 수행 전에 현재 비밀번호 입력이나 추가 인증을 요구해야 합니다.

확인 방법:비밀번호 변경, 이메일 변경, 계정 삭제 등의 작업에서 재인증 단계가 존재하는지 확인합니다.
SQL Injection 방지

사용자 입력이 SQL 쿼리에 직접 포함되지 않도록 파라미터화된 쿼리(Prepared Statement) 또는 ORM을 사용해야 합니다.

확인 방법:검색, 로그인 등 입력 필드에 ' OR 1=1-- 같은 SQL 인젝션 패턴을 입력하여 비정상 응답이 발생하지 않는지 확인합니다.
XSS(크로스 사이트 스크립팅) 방지

사용자 입력을 출력할 때 반드시 이스케이프 처리하고, Content-Security-Policy 헤더를 설정하여 인라인 스크립트 실행을 제한해야 합니다.

확인 방법:입력 필드에 <script>alert(1)</script>를 입력한 뒤, 결과 페이지에서 스크립트가 실행되지 않고 이스케이프되는지 확인합니다.
CSRF 토큰 적용

상태를 변경하는 모든 POST/PUT/DELETE 요청에 CSRF 토큰을 포함시켜 위조 요청을 방지해야 합니다.

확인 방법:폼 제출 시 CSRF 토큰이 포함되는지 확인하고, 토큰 없이 또는 변조된 토큰으로 요청을 보내 거부되는지 테스트합니다.
파일 업로드 검증

업로드 파일의 확장자, MIME 타입, 크기를 서버 측에서 검증하고, 실행 가능한 파일의 업로드를 차단해야 합니다.

확인 방법:.php, .jsp 등 실행 가능한 확장자로 파일 업로드를 시도하고, 서버에서 차단되는지 확인합니다. MIME 타입 위조도 테스트하세요.
서버 측 입력 유효성 검사

클라이언트 검증은 우회 가능하므로 모든 입력값에 대해 서버 측에서도 타입, 길이, 범위, 형식 검증을 수행해야 합니다.

확인 방법:Burp Suite 등의 프록시로 클라이언트 검증을 우회한 요청을 보내 서버에서 올바르게 거부하는지 확인합니다.
Command Injection 방지

사용자 입력이 시스템 명령어에 포함되지 않도록 화이트리스트 방식으로 입력을 검증하고, 직접 명령어 실행을 피해야 합니다.

확인 방법:입력 필드에 ; ls -la 또는 | cat /etc/passwd 같은 명령어 삽입을 시도하여 서버에서 차단되는지 확인합니다.
URL 리다이렉트 검증 (Open Redirect 방지)

로그인 후 리다이렉트 등에서 외부 URL로의 리다이렉션을 허용하지 않도록 화이트리스트 기반 검증을 적용해야 합니다.

확인 방법:리다이렉트 파라미터에 외부 URL을 넣어 요청하고, 허용되지 않은 도메인으로 이동이 차단되는지 확인합니다.
HTTP 파라미터 오염 방지

동일한 파라미터명을 여러 번 전달하여 서버 로직을 우회하는 공격을 방지하기 위해 파라미터 처리 방식을 명확히 해야 합니다.

확인 방법:동일 파라미터를 중복 전송하여 서버가 예상대로 처리하는지, 의도하지 않은 동작이 발생하지 않는지 확인합니다.
HTTPS 전면 적용 및 HSTS 설정

모든 페이지에 HTTPS를 적용하고, Strict-Transport-Security 헤더로 HTTP 접속을 자동 차단하여 중간자 공격을 방지해야 합니다.

확인 방법:HTTP로 접속을 시도하여 HTTPS로 리다이렉트되는지, 응답 헤더에 HSTS가 포함되어 있는지 확인합니다.
민감 데이터 암호화 저장

개인정보, 카드 정보 등 민감 데이터는 AES-256 이상의 안전한 알고리즘으로 암호화하여 저장해야 합니다.

확인 방법:데이터베이스에서 민감 필드가 암호화된 상태로 저장되어 있는지 직접 확인하고, 암호화 알고리즘 및 키 관리 방식을 검토합니다.
로그에 민감 정보 기록 금지

비밀번호, 토큰, 개인정보 등이 애플리케이션 로그에 기록되지 않도록 로깅 정책을 수립하고 필터링해야 합니다.

확인 방법:로그인, 결제 등 주요 기능 수행 후 서버 로그를 검색하여 비밀번호나 카드번호 등 민감 정보가 노출되지 않는지 확인합니다.
쿠키 보안 속성 설정 (Secure, HttpOnly, SameSite)

인증 쿠키에는 Secure, HttpOnly, SameSite 속성을 반드시 설정하여 탈취 및 위조를 방지해야 합니다.

확인 방법:브라우저 개발자 도구에서 쿠키 속성을 확인하여 Secure, HttpOnly, SameSite가 모두 설정되어 있는지 점검합니다.
캐시 제어 헤더로 민감 페이지 캐싱 방지

로그인 페이지, 마이페이지 등 민감한 정보가 포함된 페이지는 Cache-Control: no-store를 설정하여 브라우저 캐싱을 방지해야 합니다.

확인 방법:인증이 필요한 페이지의 응답 헤더에서 Cache-Control: no-store 또는 no-cache가 설정되어 있는지 확인합니다.
데이터 전송 시 TLS 1.2 이상 사용

외부 API 호출, DB 연결 등 모든 데이터 전송 구간에서 TLS 1.2 이상의 프로토콜을 사용해야 합니다.

확인 방법:SSL Labs 등의 도구로 서버의 TLS 설정을 분석하고, TLS 1.0/1.1이 비활성화되어 있는지 확인합니다.
민감 데이터 불필요 노출 방지

API 응답에 불필요한 개인정보를 포함하지 않도록 하고, 프론트엔드에 전달하는 데이터를 최소화해야 합니다.

확인 방법:API 응답을 검토하여 요청에 불필요한 필드(주민번호, 전체 카드번호 등)가 포함되지 않는지 확인합니다.
보안 헤더 설정 (CSP, X-Frame-Options 등)

Content-Security-Policy, X-Frame-Options, X-Content-Type-Options 등 주요 보안 헤더를 설정하여 다양한 공격을 방지해야 합니다.

확인 방법:응답 헤더를 검사하여 CSP, X-Frame-Options: DENY, X-Content-Type-Options: nosniff 등이 올바르게 설정되어 있는지 확인합니다.
디렉토리 리스팅 비활성화

웹 서버의 디렉토리 리스팅 기능을 비활성화하여 파일 목록이 외부에 노출되지 않도록 해야 합니다.

확인 방법:존재하는 디렉토리 경로(예: /images/, /assets/)에 직접 접근하여 파일 목록이 표시되지 않는지 확인합니다.
상세 에러 메시지 노출 방지

스택 트레이스, DB 정보 등이 포함된 상세 에러 메시지가 사용자에게 노출되지 않도록 커스텀 에러 페이지를 사용해야 합니다.

확인 방법:존재하지 않는 URL, 잘못된 파라미터 등으로 의도적 에러를 발생시켜 서버 내부 정보가 노출되지 않는지 확인합니다.
서버 버전 정보 숨기기

응답 헤더에서 Server, X-Powered-By 등의 버전 정보를 제거하여 공격자가 서버 환경을 파악하지 못하도록 해야 합니다.

확인 방법:응답 헤더를 확인하여 Server, X-Powered-By, X-AspNet-Version 등 서버 정보 헤더가 제거되어 있는지 확인합니다.
불필요한 HTTP 메서드 차단

TRACE, OPTIONS 등 불필요한 HTTP 메서드를 비활성화하여 XST(Cross-Site Tracing) 공격을 방지해야 합니다.

확인 방법:TRACE, DELETE 등의 HTTP 메서드로 요청을 보내 서버가 적절히 거부하는지 확인합니다.
관리자 페이지 접근 제한

관리자 페이지는 IP 화이트리스트, VPN, 별도 도메인 등을 통해 접근을 제한하고, 기본 경로(/admin)를 변경해야 합니다.

확인 방법:외부 네트워크에서 관리자 페이지 URL에 접근을 시도하여 차단되는지 확인하고, 기본 경로 변경 여부를 점검합니다.
파일 업로드 디렉토리 실행 권한 제거

사용자가 업로드한 파일이 저장되는 디렉토리에서 스크립트 실행 권한을 제거하여 웹셸 공격을 방지해야 합니다.

확인 방법:업로드 디렉토리에 테스트 스크립트를 배치한 뒤 직접 접근하여 실행되지 않고 다운로드되거나 403 에러가 반환되는지 확인합니다.
Referrer-Policy 헤더 설정

Referrer-Policy 헤더를 설정하여 외부 사이트로 이동 시 민감한 URL 정보가 유출되지 않도록 해야 합니다.

확인 방법:응답 헤더에 Referrer-Policy가 설정되어 있는지 확인하고, strict-origin-when-cross-origin 이상의 정책이 적용되었는지 점검합니다.
API Rate Limiting 적용

API 호출 횟수를 제한하여 무차별 대입 공격과 서비스 남용을 방지해야 합니다. IP 및 사용자 기준으로 제한을 설정하세요.

확인 방법:짧은 시간 내 동일 API를 반복 호출하여 429 Too Many Requests 응답이 반환되는지 확인합니다.
API 인증 토큰 안전 관리

JWT 등 인증 토큰은 적절한 만료 시간을 설정하고, 서명 알고리즘을 none으로 변경하는 공격을 방어해야 합니다.

확인 방법:만료된 토큰이나 서명이 변조된 토큰으로 API를 호출하여 올바르게 거부되는지 확인합니다.
CORS 정책 엄격 설정

Access-Control-Allow-Origin을 *로 설정하지 않고, 허용된 도메인만 명시하여 교차 출처 요청을 제어해야 합니다.

확인 방법:허용되지 않은 도메인에서 API 요청을 보내 CORS 에러가 발생하는지, 와일드카드(*)가 사용되지 않는지 확인합니다.
API 요청/응답 데이터 검증

API 입력 데이터의 스키마 검증을 수행하고, 응답에 불필요한 내부 정보가 포함되지 않도록 해야 합니다.

확인 방법:잘못된 형식의 JSON, 초과 길이의 데이터 등을 전송하여 서버가 적절한 에러 응답을 반환하는지 확인합니다.
API 버전 관리 및 사용 중단 정책

API 버전을 명확히 관리하고, 구 버전 API의 보안 패치 적용 및 사용 중단 일정을 수립해야 합니다.

확인 방법:API 엔드포인트에 버전 정보가 포함되어 있는지, 구 버전 API가 여전히 접근 가능한 경우 보안 패치가 적용되어 있는지 확인합니다.
GraphQL Introspection 비활성화 (해당 시)

프로덕션 환경에서는 GraphQL Introspection 쿼리를 비활성화하여 스키마 정보 노출을 방지해야 합니다.

확인 방법:GraphQL 엔드포인트에 __schema 쿼리를 보내 스키마 정보가 반환되지 않는지 확인합니다.
Webhook 요청 검증

외부 서비스로부터의 Webhook 요청은 서명을 검증하여 위조된 요청을 차단해야 합니다.

확인 방법:Webhook 엔드포인트에 서명 없이 또는 잘못된 서명으로 요청을 보내 거부되는지 확인합니다.
디버그 모드 비활성화

프로덕션 환경에서 디버그 모드, 개발자 도구, 소스맵 등을 비활성화하여 내부 정보 노출을 방지해야 합니다.

확인 방법:프로덕션 URL에서 상세 에러 페이지, .map 파일 접근, 개발자 전용 엔드포인트 등이 비활성화되어 있는지 확인합니다.
의존성 취약점 정기 검사

npm audit, Snyk, Dependabot 등을 활용하여 사용 중인 패키지의 알려진 취약점을 정기적으로 점검하고 업데이트해야 합니다.

확인 방법:npm audit 또는 yarn audit를 실행하여 high/critical 취약점이 없는지 확인하고, CI/CD 파이프라인에 자동 검사를 통합합니다.
정기 백업 및 복구 테스트

데이터베이스와 주요 파일의 정기 백업을 수행하고, 복구 절차가 정상 동작하는지 주기적으로 테스트해야 합니다.

확인 방법:백업 스케줄이 설정되어 있는지 확인하고, 실제로 백업 파일에서 데이터를 복구하여 정상 동작하는지 테스트합니다.
환경 변수로 민감 정보 관리

API 키, DB 비밀번호 등 민감 정보를 소스 코드에 하드코딩하지 않고, 환경 변수 또는 시크릿 매니저로 관리해야 합니다.

확인 방법:소스 코드 전체에서 API 키, 비밀번호 등의 하드코딩된 값이 없는지 검색하고, .env 파일이 버전 관리에서 제외되어 있는지 확인합니다.
보안 로깅 및 모니터링 구축

로그인 실패, 권한 오류, 비정상 접근 등 보안 이벤트를 로깅하고 실시간 모니터링 및 알림 체계를 구축해야 합니다.

확인 방법:보안 관련 이벤트가 로그에 기록되는지 확인하고, 임계값 초과 시 알림이 발송되는지 테스트합니다.
CI/CD 파이프라인 보안 점검

빌드/배포 파이프라인에 보안 스캔(SAST, DAST)을 통합하고, 배포 권한을 최소 인원으로 제한해야 합니다.

확인 방법:CI/CD 설정에서 보안 스캔 단계가 포함되어 있는지, 배포 권한이 적절하게 제한되어 있는지 확인합니다.
사고 대응 계획 수립

보안 사고 발생 시 탐지, 격리, 복구, 보고의 단계별 대응 절차를 문서화하고 정기 훈련을 실시해야 합니다.

확인 방법:사고 대응 문서가 최신 상태인지, 담당자 연락처와 에스컬레이션 절차가 명확한지, 최근 훈련 기록이 있는지 확인합니다.
컨테이너/서버 이미지 최소화

불필요한 패키지, 도구, 사용자 계정을 제거한 최소 이미지를 사용하여 공격 표면을 줄여야 합니다.

확인 방법:Docker 이미지에서 불필요한 패키지 목록을 확인하고, distroless 또는 alpine 기반 이미지를 사용하는지 점검합니다.