C
보안/공격/Lesson 02

웹 공격 — OWASP Top 10 + XSS · CSRF · SQL Injection

45분·theory

웹 공격 — OWASP Top 10 + XSS · CSRF · SQL Injection

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ OWASP Top 10 중 Top 5 외우기
  • ✅ SQL Injection · XSS · CSRF 방어 코드 패턴
  • ✅ PreparedStatement / DOMPurify / SameSite 활용

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

OWASP Top 10 (2021) — 가장 위험한 웹 취약점

한 줄: OWASP = 비영리 보안 단체. Top 10 은 가장 흔한 웹 취약점 카테고리. 면접 단골.

순위카테고리의미
A01Broken Access Control권한 검증 누락 → 다른 사람 데이터 접근
A02Cryptographic Failures평문 통신·약한 해시·키 노출
A03InjectionSQL·NoSQL·Command·LDAP injection
A04Insecure Design설계 단계의 보안 결함
A05Security Misconfiguration기본 비번·디버그 모드·노출된 관리자 페이지
A06Vulnerable Components오래된 라이브러리·CVE 미패치
A07Auth Failures비번 무작위 대입·세션 고정
A08Software & Data Integrity검증 안 된 업데이트·CI/CD 손상
A09Logging Failures침입 흔적 감지 불가
A10SSRF서버가 외부 요청 → 내부망 접근

> 💡 A01·A03·A07 이 가장 자주 발생. 입사 후 첫 코드 리뷰에서 100% 마주침.

XSS · CSRF · SQL Injection — 3 대 흔한 공격

XSS (Cross-Site Scripting) — 악성 스크립트 삽입

종류예시
StoredDB에 <script>steal()</script> 저장 → 페이지 방문자 모두 실행
ReflectedURL 파라미터 ?q=<script> → 응답에 그대로 → 클릭 시 실행
DOM-basedJS가 location.hash 등을 그대로 innerHTML 에

XSS 방어 4가지:
1. 출력 escape<&lt; (React·Vue 기본 처리)
2. CSP (Content-Security-Policy) — 신뢰 스크립트만 허용
3. httpOnly 쿠키 — JS 에서 세션 토큰 접근 X
4. innerHTML 대신 textContent


CSRF (Cross-Site Request Forgery) — 다른 사이트가 내 인증 정보로 요청

  • 예: evil.com 페이지에 <img src="bank.com/transfer?to=hacker&amt=999"> 삽입
  • 브라우저가 자동으로 bank.com 쿠키 첨부 → 송금됨

CSRF 방어:

  • CSRF 토큰 — 폼에 랜덤 토큰. 서버가 검증. Spring Security 기본 제공
  • SameSite 쿠키SameSite=Lax/Strict — 외부 도메인에서 쿠키 X
  • Origin/Referer 검증 — 요청 출처 확인

SQL Injection — 사용자 입력이 SQL 의 일부가 됨

  • ❌ 취약: "SELECT * FROM users WHERE id='" + input + "'"
  • 입력: 1' OR '1'='1 → 모든 행 반환
  • 입력: 1'; DROP TABLE users; -- → 테이블 삭제

방어:

  • Parameterized Query (Prepared Statement):
python
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
  • ORM 사용 (SQLAlchemy·Hibernate·Prisma) — 자동 escape
  • 입력 화이트리스트 — 숫자·UUID 등 명확한 형식만

> ⚠️ "' 만 escape하면 안전" 은 틀린 통념. 항상 parameterized query.

💻 📌 공격 방어 코드 예시 (Spring + Node)
// === Spring Security — CSRF + XSS + 헤더 ===
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
            // CSRF — Spring Security 기본 활성화
            .csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
            // 보안 헤더
            .headers(h -> h
                .contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'"))
                .frameOptions(f -> f.deny())              // Clickjacking 방어
                .xssProtection(xss -> xss.disable())      // 모던 브라우저는 CSP 권장
                .httpStrictTransportSecurity(hsts -> hsts.maxAgeInSeconds(31536000))
            )
            // 쿠키 보안
            .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .build();
    }
}

// === Parameterized Query — Spring JPA ===
// ❌ 취약 (절대 X):
// @Query("SELECT u FROM User u WHERE u.name = '" + name + "'")
// ✅ 안전:
public interface UserRepo extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.name = :name")
    Optional<User> findByName(@Param("name") String name);
}

// ─────────────────────────────────────────────────
// Node.js (Express) 예시
// ─────────────────────────────────────────────────
/*
const helmet = require('helmet');
const csrf = require('csurf');

app.use(helmet());                 // 보안 헤더 자동
app.use(csrf({ cookie: true }));   // CSRF 토큰 자동 검증
app.use(express.json({ limit: '10kb' }));   // payload 제한

// XSS - React 가 기본으로 escape. dangerouslySetInnerHTML 만 주의

// SQL Injection - pg parameterized
const result = await pool.query(
  'SELECT * FROM users WHERE id = $1',     // $1 placeholder
  [userId]                                  // 값
);

// 쿠키
app.use(session({
  cookie: { httpOnly: true, secure: true, sameSite: 'lax' }
}));
*/

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 코드의 SQL Injection / XSS / CSRF 취약점 점검해줘"
  • "이 입력값 검증을 화이트리스트 방식으로 강화해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: 보안
웹 공격 — OWASP Top 10 + XSS·CSRF·SQL Injection - 보안