핵심 인사이트 (3줄 요약)

  1. 본질: SW 개발보안(시큐어 코딩, Secure Coding)은 취약점을 설계·개발 단계에서 원천 차단하는 예방 중심 접근이다.
  2. 가치: SQL 인젝션(SQL Injection), XSS(Cross-Site Scripting), CSRF(Cross-Site Request Forgery) 세 공격 유형은 OWASP(Open Web Application Security Project) Top 10의 핵심으로, 감리 점검 빈도가 가장 높다.
  3. 판단 포인트: 입력값 검증(Input Validation)·출력값 인코딩(Output Encoding)·토큰 기반 요청 인증이 코드 레벨에서 구현되었는지를 소스코드 및 실행 결과 모두에서 확인한다.

Ⅰ. 개요 및 필요성

SW 개발보안(시큐어 코딩, Secure Coding)은 소프트웨어 개발 생명주기(SDLC, Software Development Life Cycle) 전 단계에 걸쳐 보안 취약점을 제거하는 실천 체계다. 행정안전부 「소프트웨어 개발보안 가이드」는 SQL 인젝션, XSS, CSRF를 포함한 43개 취약점 진단 항목을 규정하며, 공공정보화사업 감리 시 반드시 확인해야 한다.

공격 유형영문 Full Name공격 원리피해 범위
SQL 인젝션SQL Injection사용자 입력을 SQL 쿼리에 직접 삽입DB 전체 탈취·삭제
OS 인젝션OS Command Injection입력값으로 시스템 명령 실행서버 루트 권한 탈취
XSSCross-Site Scripting악성 스크립트를 피해자 브라우저에서 실행세션 쿠키 탈취·피싱
CSRFCross-Site Request Forgery인증된 사용자의 권한으로 위조 요청 실행계정 변경·결제 위조
  • 「전자정부법」 제45조의3: 정보보호 진단·점검 의무
  • 행정안전부 「소프트웨어 개발보안 가이드(2021)」: 43개 진단 항목
  • KISA(한국인터넷진흥원, Korea Internet & Security Agency) 취약점 진단 기준
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ Problem      │──▶│ Core Idea    │──▶│ Expected Gain │
└──────────────┘    └──────────────┘    └──────────────┘
  • 📢 섹션 요약 비유: SQL 인젝션은 "식당 주문서에 '모든 메뉴를 공짜로 주세요'라고 적어 요리사를 혼란에 빠트리는 것"이다. 입력 칸을 신뢰하지 않는 것이 시큐어 코딩의 출발점이다.

Ⅱ. 아키텍처 및 핵심 원리

┌────────────────────────────────────────────────────────────┐
│                    요청 처리 파이프라인                      │
│                                                            │
│  [사용자 입력]                                              │
│       │                                                    │
│       ▼                                                    │
│  ┌──────────────────────────────┐                          │
│  │  1. 입력값 화이트리스트 검증   │  ← 허용 문자만 통과       │
│  │     (Whitelist Validation)   │                          │
│  └──────────────┬───────────────┘                          │
│                 │                                          │
│                 ▼                                          │
│  ┌──────────────────────────────┐                          │
│  │  2. PreparedStatement 사용   │  ← ? 플레이스홀더 바인딩  │
│  │     (Parameterized Query)    │                          │
│  └──────────────┬───────────────┘                          │
│                 │                                          │
│                 ▼                                          │
│  ┌──────────────────────────────┐                          │
│  │  3. 최소 권한 DB 계정 사용    │  ← SELECT 전용 계정       │
│  │     (Least Privilege)        │                          │
│  └──────────────┬───────────────┘                          │
│                 │                                          │
│                 ▼                                          │
│            [DB 실행 완료]                                   │
└────────────────────────────────────────────────────────────┘

XSS는 사용자가 입력한 <script> 태그가 다른 사용자의 브라우저에서 실행되는 공격이다. 방어의 핵심은 출력 시점의 컨텍스트별 인코딩이다.

┌────────────────────────────────────────────────────────────┐
│               XSS 방어 필터 흐름                            │
│                                                            │
│  입력: <script>alert('XSS')</script>                        │
│       │                                                    │
│       ▼                                                    │
│  ┌──────────────────────────┐                              │
│  │   HTML 컨텍스트 인코딩    │                              │
│  │   < → &lt;               │                              │
│  │   > → &gt;               │                              │
│  │   " → &quot;             │                              │
│  │   ' → &#x27;             │                              │
│  └──────────────┬───────────┘                              │
│                 │                                          │
│  출력: &lt;script&gt;alert(&#x27;XSS&#x27;)&lt;/script&gt; │
│       → 브라우저: 텍스트로 표시 (실행 불가)                  │
└────────────────────────────────────────────────────────────┘

CSRF 토큰(CSRF Token)은 서버가 생성한 난수값을 폼(Form) 히든 필드에 삽입하여 위조 요청을 차단한다.

┌────────────────────────────────────────────────────────────┐
│              CSRF 토큰 검증 흐름                             │
│                                                            │
│  [서버] 세션 생성 시 토큰 발급                               │
│       │  Token = "a3f9b2c1d8e7..."                         │
│       ▼                                                    │
│  [클라이언트] 폼에 히든 필드로 포함                          │
│       │  <input type="hidden" name="_csrf" value="..."/>   │
│       ▼                                                    │
│  [요청 수신] 서버에서 토큰 일치 검증                         │
│       │                                                    │
│       ├── 토큰 일치 → 요청 처리                              │
│       └── 토큰 불일치 → 403 Forbidden 반환                  │
└────────────────────────────────────────────────────────────┘
항목설명포인트
핵심 역할입력·상태·출력을 분리하는 책임 경계구현보다 경계를 먼저 본다.
제어 지점조건, 이벤트, 정책이 만나는 곳병목과 결합이 생기는 곳이다.
검증 포인트테스트·로그·모니터링으로 확인할 지점운영 가능성이 설계 품질을 결정한다.
  • 📢 섹션 요약 비유: XSS 방어는 "스피커에 전달된 대사를 그대로 읽지 않고 따옴표로 묶어 안전하게 출력"하는 것이고, CSRF 방어는 "편지에 비밀 도장이 없으면 배달부가 접수를 거부"하는 것이다.

Ⅲ. 비교 및 연결

구분SQL 인젝션 방어XSS 방어CSRF 방어
핵심 원리입력과 코드 분리출력 컨텍스트 인코딩요청 출처 검증
구현 방법PreparedStatement, ORM(Object-Relational Mapping)HTML 엔티티 인코딩, CSP(Content Security Policy) 헤더CSRF 토큰, SameSite 쿠키
감리 확인 위치DAO(Data Access Object) 레이어 코드뷰(View) 템플릿 출력 함수폼 히든 필드, 서버 검증 로직
자동 탐지 도구SAST(Static Application Security Testing)DAST(Dynamic Application Security Testing)DAST + 수동 점검
위험 등급CriticalHighHigh
기준SAST (정적 분석)DAST (동적 분석)
분석 시점코드 작성 후 빌드 단계실행 중인 애플리케이션
도구 예시Fortify, SonarQube, CheckmarxOWASP ZAP, Burp Suite
장점초기 발견, 낮은 비용실제 공격 시나리오 재현
단점오탐(False Positive) 다수실행 환경 필요
  • 📢 섹션 요약 비유: SAST는 "요리 전 재료 목록을 검사"하고, DAST는 "완성된 음식을 직접 먹어보며 독성을 확인"하는 것이다. 감리는 두 방법 모두를 요구한다.

Ⅳ. 실무 적용 및 기술사 판단

점검 항목확인 방법판정 기준
PreparedStatement 적용률DAO 레이어 코드 전수 검사SQL 동적 쿼리 0건
XSS 인코딩 함수 사용출력 뷰 파일 검색fn:escapeXml() 또는 동등 함수 100% 적용
CSRF 토큰 구현상태 변경 요청(POST/PUT/DELETE) 전수히든 필드 + 서버 검증 모두 존재
CSP(Content Security Policy) 헤더HTTP 응답 헤더 확인default-src 'self' 이상 설정
오류 메시지 노출고의 오류 발생 후 응답 확인DB/쿼리 정보 미노출
  • ORM(Object-Relational Mapping) 사용 시 주의: JPA(Java Persistence API)/MyBatis의 ${} 대신 #{} 사용 여부 확인. ${}는 PreparedStatement를 우회하여 SQL 인젝션에 취약하다.
  • DOM 기반 XSS: 서버 응답이 안전해도 JavaScript에서 innerHTML, document.write() 사용 시 클라이언트 측 XSS 발생 가능 — DAST로만 탐지 가능.
  • CSRF 예외 관리: API 게이트웨이에서 JWT(JSON Web Token) 기반 인증을 사용하는 경우 CSRF 위험은 낮으나, 쿠키 기반 세션과 혼용 시 반드시 토큰 적용.

판단 체크리스트

  1. 위험 시나리오와 점검 범위가 문서로 합의되었는가?
  2. 지표·증적·로그가 재현 가능하게 수집되는가?
  3. 예외 상황과 오탐·미탐 처리 절차가 있는가?
  4. 재시험 또는 후속 조치 기준이 수치로 정의되었는가?
  • 📢 섹션 요약 비유: ORM에서 ${} 사용은 "문잠금 장치를 설치했지만 비상구 문은 열어둔 것"이다. 감리는 그 비상구까지 반드시 확인한다.

Ⅴ. 기대효과 및 결론

시큐어 코딩 진단이 체계적으로 수행되면 SQL 인젝션을 통한 DB 탈취, XSS를 통한 세션 하이재킹(Session Hijacking), CSRF를 통한 권한 남용이 코드 레벨에서 원천 차단된다. 행정안전부 통계에 따르면 공공기관 침해사고의 약 40%가 웹 취약점에서 발생하며, 특히 SQL 인젝션과 XSS가 주를 이룬다. 감리 단계에서 조기 발견 시 수정 비용은 운영 단계 대비 1/10 이하로 절감된다.

감리인은 자동화 도구(SAST/DAST) 결과와 수동 코드리뷰를 병행하고, 특히 입력 처리→DB 연동→출력 렌더링 전 경로를 추적하는 **데이터 흐름 분석(Data Flow Analysis)**을 핵심 점검 방법으로 적용해야 한다.

확장 방향은 ① Policy as Code, ② Continuous Audit, ③ 인공지능(AI, Artificial Intelligence) 기반 이상 탐지와 결합하는 것이다.

  • 📢 섹션 요약 비유: 시큐어 코딩 감리는 건물 완공 전 소방 배선을 점검하는 것과 같다. 벽을 뜯고 다시 배선하는 비용보다 사전 점검이 훨씬 저렴하고 안전하다.

📌 관련 개념 맵

관계개념설명
상위 개념SW 개발보안 (Secure Coding)43개 취약점 진단 체계 전체
상위 개념OWASP Top 10웹 보안 10대 위험 목록
하위 개념PreparedStatementSQL 인젝션 방어 핵심 구현체
하위 개념CSP (Content Security Policy)XSS 방어를 위한 HTTP 응답 헤더
하위 개념SameSite 쿠키CSRF 방어를 위한 쿠키 속성
연관 개념SAST / DAST정적·동적 보안 테스트 도구
연관 개념KISA 취약점 진단공공기관 법적 점검 기준

📈 관련 키워드 및 발전 흐름도

위협 모델링 → 시큐어 코딩 SQL/XSS/CSRF 진단 → SAST/DAST·보안 테스트

👶 어린이를 위한 3줄 비유 설명

  1. SQL 인젝션은 마법 주문서에 "내 말을 무조건 따라!"라고 쓴 쪽지를 몰래 끼워 넣는 속임수야.
  2. XSS는 친구에게 전달할 편지 속에 폭탄 스티커를 숨겨 상대방 책상에서 터지게 하는 것이고.
  3. CSRF는 누군가가 엄마 이름으로 가짜 편지를 써서 용돈을 자기 통장에 넣도록 속이는 것이야.