소프트웨어 개발보안 문제는 공격 문자열을 외우는 방식으로 공부하면 변형에 약합니다. 먼저 외부 입력이 어디로 들어가고, 어떤 해석기를 거치며, 어느 문맥에서 실행되는지를 추적해야 취약점과 대응책을 정확히 연결할 수 있습니다.

입력값이 코드로 해석되는 경계를 찾습니다

외부 입력 자체가 곧 취약점은 아닙니다. 입력값이 문자열 결합을 통해 SQL 문의 구조를 바꾸거나, HTML·JavaScript 문맥에서 실행되거나, 파일 경로를 벗어나도록 사용되는 지점을 찾아야 합니다. 문제의 코드에서 입력 출처와 위험한 처리 함수를 선으로 연결하세요.

취약 코드 읽는 네 단계
  1. 입력사용자·요청·파일에서 들어온 값을 표시한다.
  2. 전달검증·변환을 거쳐 어디로 이동하는지 추적한다.
  3. 해석DB, 브라우저, 운영체제, 파일시스템이 값의 일부를 명령으로 해석하는지 본다.
  4. 대응그 해석 경계에 맞는 근본 통제를 고른다.

SQL 삽입은 쿼리 구조와 데이터가 섞일 때 발생합니다

사용자 입력을 SQL 문자열에 그대로 이어 붙이면 입력이 데이터가 아니라 SQL 구문의 일부로 해석될 수 있습니다. 대표 대응은 준비된 문장과 매개변수화된 쿼리를 사용해 SQL 구조와 값을 분리하는 것입니다. 테이블명이나 정렬 방향처럼 바인딩하기 어려운 식별자는 허용 목록으로 제한해야 합니다.

XSS는 출력되는 문맥에 맞춰 인코딩합니다

신뢰할 수 없는 값이 브라우저에서 실행 가능한 HTML이나 스크립트로 해석되면 XSS가 발생할 수 있습니다. 방어는 입력을 무조건 삭제하는 한 가지 규칙이 아니라 HTML 본문, 속성, URL, JavaScript 등 출력 문맥에 맞는 인코딩과 안전한 출력 함수를 사용하는 것입니다. 사용자가 HTML을 작성해야 한다면 검증된 방식으로 살균하는 절차도 필요합니다.

취약점대표 대응 원리
SQL 삽입SQL 구조와 입력 데이터를 매개변수화로 분리
XSS출력 문맥별 인코딩과 안전한 DOM·템플릿 사용
경로 조작기준 디렉터리 고정, 정규화 뒤 범위 확인, 허용 목록 적용
운영체제 명령 삽입셸 호출 회피, 안전한 API와 인자 분리, 허용 목록 적용

경로 조작은 문자열 포함 검사보다 최종 경로를 확인합니다

../ 문자열 한 가지만 막으면 인코딩과 운영체제별 경로 표현을 놓칠 수 있습니다. 서버가 허용한 파일 이름이나 식별자만 받도록 범위를 줄이고, 경로를 정규화한 뒤 최종 위치가 기준 디렉터리 안에 있는지 확인해야 합니다.

외부 입력 지점을 표시했는가입력이 어느 해석기로 들어가는지 확인했는가공격명과 위험한 처리 방식이 대응하는가입력 검증만 만능 대응으로 쓰지 않았는가출력 문맥에 맞는 통제를 골랐는가최소 권한과 오류 처리도 확인했는가

답안은 취약점·원인·대응 원리를 한 줄씩 연결합니다

서술형에서는 “SQL 삽입을 방지한다”로 끝내지 마세요. “외부 입력을 SQL 문자열에 결합해 쿼리 구조가 바뀔 수 있으므로, 준비된 문장과 매개변수 바인딩으로 구조와 데이터를 분리한다”처럼 원인과 대응이 맞물리게 씁니다.

SQL 결과 계산도 함께 준비해야 한다면 정보처리기사 실기 SQL 공부법으로 이어가세요.