09 — 웹 공격과 시큐어코딩

전체 요약 목차

A. 개발보안과 검사

요구사항에서 보호 자산·신뢰 경계·악용 가능성을 식별하고, 설계에서 인증/인가·데이터 처리·오류 정책을 정하며, 구현과 검사·배포/운영에서 확인·수정한다. 애자일·폭포수 등 방법론 명칭보다 보안 활동이 빠지지 않는지가 중요하다. 보안 활동은 요구사항부터 운영까지 개발 수명주기 전반에 배치한다.

정적 검사는 실행하지 않은 소스/바이너리 구조, 동적 검사는 실행 중 요청·응답·상태를 관찰한다. 부하/스트레스 검사는 자원·성능 한계, 침투시험은 허용된 범위의 공격 가능성과 영향을 확인하는 관점이다. 검사 목적과 방식은 함께 조합할 수 있다. 도구 경고를 재현·분석한 뒤 수정하고 재시험한다. sqlmap 같은 도구는 지원하는 취약점 검사 범위에 맞춰 활용한다.

CWE는 약점 유형, CVE는 특정 공개 취약점 식별이다. 국내 가이드의 범주와 CWE는 각 문서의 분류 기준으로 대응시킨다. 행안부 2021.11 수정배포 가이드는 구현단계에 입력데이터 검증 및 표현·보안기능·시간 및 상태·에러처리·코드오류·캡슐화·API 오용의 7범주, 목차상 49항목을 둔다. 설계단계 기준은 이 표와 별도다. 항목 수는 해당 2021.11 판본을 기준으로 하며 다른 판본·법적 의무는 해당 문서를 확인한다. 공식 게시물·첨부, 분류 근거는 해당 PDF의 개정 이력·목차·목적 부분이다.

B. SQL 삽입

신뢰하지 않는 값이 문자열 결합을 거쳐 SQL 구문으로 해석되는 것이 핵심이다. 값의 바인딩과 질의 구조를 분리하는 매개변수 질의를 우선한다. 바인딩할 수 없는 식별자·정렬 방향 등은 허용 목록/고정 매핑으로 구조를 제한한다. 저장 프로시저 내부에서도 동적 SQL의 값과 구문을 분리한다.

UNION은 조회 결과를 합치는 구문이다. 데이터 변경에는 해당 변경 구문과 실행 권한 등의 조건이 필요하다. 오류 기반·참/거짓·시간 차이 등은 결과를 관찰하는 방식이다. 입력 위치·중첩 질의·DB 권한·사용 API는 별도 조건이며 정보 노출 관찰과 수정/OS 실행 성공은 다르다. 매개변수 질의로 원인을 다루고 최소 DB/OS 권한과 상세 오류 제한으로 피해를 줄인다. 추가 인증·입력 제한은 해당 경로의 보조 통제로 적용한다. OWASP SQLi

PHP magic_quotes는 PHP5.4에서 제거된 역사적 기능이다. SQL 삽입 방어는 위의 매개변수 질의·허용 목록·최소권한 원리로 이해한다. PHP5.4 발표

C. XSS

브라우저가 공격자 영향을 받은 데이터를 페이지의 실행 가능한 내용으로 해석하는 문제다. 저장/반사는 데이터 보존·전달 축이고, DOM 기반은 클라이언트 코드의 source→sink 처리 축이므로 두 축을 함께 적용해 발생 위치와 전달·보존 방식을 읽는다. 피해에는 쿠키 탈취, 사용자의 페이지 권한을 이용한 요청·화면 변경 등이 있다.

HTML 본문·속성·JavaScript·URL 문맥마다 맞는 출력 처리가 필요하다. 일반 텍스트는 안전한 sink를 사용하고, HTML 자체를 허용할 때는 정제한다. 정제 후 다시 위험한 형태로 가공하면 보호가 깨질 수 있다. 출력 문맥과 안전한 sink로 원인을 다루고 CSP·WAF·HttpOnly로 각 경로를 추가 보호한다. 저장형 XSS는 저장된 악성 내용을 처리하고 세션은 서버의 만료·무효화 정책으로 관리한다. OWASP XSS

D. CSRF와 SSRF

CSRF는 피해자의 브라우저가 인증 쿠키 등 자격을 자동 첨부하는 흐름을 악용해 원치 않는 요청을 보내게 하는 문제다. 상태 변경 요청에 서버 검증 토큰·출처 검증·적절한 SameSite 정책을 적용한다. 요청 방식과 필드 형태에 더해 서버가 토큰·출처·전송 조건을 실제 검증해야 한다. XSS가 있으면 같은 출처의 권한으로 CSRF 방어를 우회할 수 있으므로 별도로 제거한다. XSS는 브라우저의 데이터 해석·실행, CSRF는 자격증명이 자동 첨부되는 요청 흐름을 기준으로 구분한다. OWASP CSRF

SSRF는 서버가 공격자가 영향을 준 목적지에 요청하는 문제다. 서버가 접근 가능한 내부망·메타데이터·신뢰 서비스가 영향 범위다. 허용 목적지·프로토콜·포트, 주소 정규화, IPv4/IPv6 해석, 리다이렉트 재검증과 외부 연결 정책을 함께 본다. 최초 입력 검사부터 실제 연결까지 주소 해석·리다이렉트의 목적지를 검증한다. 브라우저 쿠키를 이용하는 CSRF와 요청 주체가 다르다. OWASP SSRF

E. 파일·경로

파일 업로드 성공·저장 성공·웹 접근 가능·처리기 해석·OS 실행은 서로 다른 단계다. 허용 형식·실제 내용·크기·파일명·저장 위치·권한·후처리를 함께 확인한다. 가능하면 웹 루트 밖이나 분리 호스트에 저장하고, 다운로드도 객체별 인가를 거친다. 스크립트는 처리기가 읽어 실행할 수 있으므로 저장 위치와 처리기 연결·읽기 권한까지 통제한다. 검사 서비스 이용 시 외부 자료 유출 위험도 있다. OWASP 파일 업로드

경로 조작은 의도한 파일 경계를 벗어나는 문제다. 서버 측 ID 매핑·경로 정규화와 허용 루트·심볼릭 링크 등 실제 대상 확인을 결합한다. DocumentRoot는 웹 콘텐츠의 기준 경로이며 프로세스 파일 접근은 OS 권한·격리 정책으로 통제한다. LFI/RFI는 파일 포함/해석 기능과 입력 통제 실패가 결합한 문제이며 파일 읽기·해석·코드 실행은 사용 기능과 실행 조건에 따라 구분한다.

PHP에서 URL 파일 접근과 URL include는 관련되지만 별도 옵션이다. allow_url_include는 7.4부터 deprecated된 역사적 옵션이다. URL 접근·포함과 로컬 파일 포함은 각 입력·권한·해석 경로를 통제한다. PHP 원격 파일, 옵션 문서

F. 인증·인가·세션

로그인은 신원 확인이고, 각 요청의 객체·행위·소유/역할 범위에 대한 인가는 별도다. 서버는 매 요청마다 신뢰할 사용자 신원과 대상 객체·행위·소유·역할을 정책에 대조해 권한을 검사한다. 복잡한 식별자와 메뉴 숨김은 노출을 줄이는 보조 수단이다. OWASP 인가

세션은 논리적인 상태 유지이고 쿠키는 식별자 전달/저장 수단 중 하나다. 서버 세션 저장소와 클라이언트 토큰 방식은 구현이 다르다. 고정 공격은 공격자가 아는 ID를 피해자 세션에 사용하게 하는 문제, 탈취는 유효 ID 노출, 추측은 예측 가능성 문제다. 인증/권한 변경 시 ID 재발급·이전 ID 무효화, 충분한 난수성, 서버 측 idle/absolute 만료를 적용한다. 저장소의 쓰레기 수거와 요청 시 만료 검증은 다르다. OWASP 세션

쿠키/전송 속성범위
Secure안전한 전송 경로로 쿠키 전달 제한
HttpOnly스크립트의 쿠키 읽기 제한
SameSite사이트 간 요청의 쿠키 전송 조건
Domain/Path쿠키 전달 도메인·경로 범위
Expires/Max-Age브라우저 보관 수명; 서버 세션 폐기와 별도

브라우저의 쿠키 보관·복원과 서버의 세션 만료·로그아웃 처리를 각각 관리한다. 토큰 암호화·MAC/서명 검증·전송 TLS는 다른 역할이다. Referer/사용자 지정 헤더·X-Forwarded-For 문자열은 신뢰하는 프록시와 생성 경계를 확인한다. CAPTCHA는 자동화 비용을 높이는 보조 통제로 사용하고 본인 인증·속도 제한·업무별 인가를 함께 적용한다. 비밀번호 복구는 C02에서 설명한다.

G. 명령·파서·메모리 경계

OS 명령 삽입은 데이터가 명령/인자 의미를 바꾸는 문제다. 가능하면 shell 호출 대신 전용 API를 쓰고, 실행 파일·인자 경계·허용 값·권한을 제한한다. shell 해석과 실행 파일의 옵션 해석을 각각 고려해 인자 경계를 보호한다. OWASP 명령 삽입

XXE는 외부 개체·DTD 등 파서 기능이 신뢰 경계 밖 자원을 읽게 하는 문제다. 불필요한 외부 참조/DTD/XInclude를 제한하고 필요한 파서의 실제 옵션·확장량·외부 연결을 확인한다. XPath 삽입은 질의 구문과 데이터 분리 문제이며 사용 API가 지원하는 변수 바인딩·허용 구조를 적용한다. HTTP 응답분할은 입력의 개행이 헤더/응답 경계를 바꾸는 문제다. 안전한 헤더 API와 개행 제한을 사용하며 응답 형식과 처리 규칙은 해당 HTTP 버전을 기준으로 확인한다. OWASP XXE, CWE643, CWE113

C 문자열은 용량·널 종료·복사 길이를 함께 확인한다. strncpy 등 길이 제한 함수도 실제 복사 길이와 널 종료 조건을 확인한다. 포맷은 신뢰하는 고정 형식으로 두고 입력은 데이터 인자로 전달한다. %n은 출력된 문자 수를 포인터에 기록하며 %hn은 short 계열이므로 타입/플랫폼 크기를 확인한다. 메모리 손상 일반은 C06에서 설명한다. strncpy, printf

Shellshock은 취약 Bash의 환경 변수/함수 정의 처리와 실행 경로가 결합한 역사적 구현 결함이다. 해당 취약 구현과 환경 변수 입력·실행 경로를 확인하고 공급자 패치와 입력 경계 통제를 적용한다. Red Hat 권고

H. 웹 운영

서비스 계정 최소 권한·불필요한 기능/샘플/백업 파일 제거·실효 접근 정책을 확인한다. Apache2.4의 Directory는 파일시스템 경로, Location은 URL 공간이며 Files는 파일명 조건이다. 각 적용 범위·병합·상속을 읽는다. Options의 Indexes는 디렉터리 목록을 제어하고 파일 직접 접근은 별도 인가 정책으로 관리한다.

Limit/LimitExcept는 지정/비지정 메소드에 안쪽 접근통제를 적용하는 범위다. 실제 허용·거부는 섹션 내부의 접근통제 지시문이 정한다. AllowOverride와 AllowOverrideList에 따라 .htaccess 허용이 달라진다. ServerTokens는 응답 Server 헤더, ServerSignature는 서버 생성 문서의 서명 정보를 다루며 다른 헤더·동작에서도 구현 단서가 드러날 수 있어 노출을 함께 점검한다. KeepAliveTimeout은 다음 요청 대기이고 요청 수신 제한·로그인 세션 만료와 다르다. Apache2.4 core

오류의 사용자 응답과 내부 진단 로그를 분리한다. no-cache는 재사용 전 검증, no-store는 저장 제한이다. 기밀성은 인증·인가·암호화와 함께 보호한다. robots.txt는 크롤러 동작 안내, 관리 경로 변경은 노출 축소에 사용한다. RFC9111 캐시, RFC9309 크롤러 규칙

I. WAF

WAF는 관찰 가능한 요청·응답에 규칙을 적용해 공격 영향을 완화한다. 앱의 취약 원인을 수정하면서 WAF를 보완 통제로 운영한다. TLS 종료/복호화 위치·검사 대상 버퍼·크기 제한·정규화와 앱 해석 차이를 확인한다. HTTPS 내용의 가시성은 TLS 종료·복호화 위치에 따르고 DOM 실행은 브라우저 측 흐름도 확인한다.

ModSecurity2.x의 phase1은 요청 헤더, 2는 요청 본문, 3은 응답 헤더, 4는 응답 본문, 5는 로깅이다. 첫 단계에서 본문이 아직 없고, 로깅 단계는 이미 늦어 차단할 수 없다. 실제 버전·커넥터·모듈 훅에 따라 이용 가능한 정보와 처리 시점이 달라진다. 공식 v2.x 참조

핵심 연결

  • 개발보안은 요구사항·설계·구현·검사·운영 전반에 배치한다.
  • 인젝션은 명령·질의 구조와 외부 입력 데이터를 분리해 방어한다.
  • XSS는 출력 문맥과 안전한 sink, CSRF는 요청 검증, SSRF는 서버의 목적지 통제로 다룬다.
  • 파일은 업로드·저장·접근·해석·실행 단계별로 검증한다.
  • 인증된 사용자에게도 요청별 객체·행위 인가를 적용하고 세션 수명을 관리한다.
  • 웹 운영과 WAF는 앱의 원인 수정에 접근 정책·관찰·완화를 결합한다.

출처와 범위

2026-09-09까지 대조한 채택 핵심을 유지한다. 2026-09-10에는 출처 연결과 문서 구성을 정리했으며 기술·법령의 최신성 재검증은 수행하지 않았다. 제품·규격은 명시된 버전과 조건을 기준으로 읽는다.