모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

22강 / 전체 25강

SW 개발 보안과 보안 약점

11분 읽기 조회 0

SW 개발보안 제도와 설계 20·구현 49 기준, Secure SDLC·STRIDE, 입력데이터 검증·보안기능·에러처리·세션통제·코드오류·캡슐화·API 오용 핵심 약점

🎯 이 강의 학습 목표

방화벽을 아무리 잘 세워도 애플리케이션 코드 안의 SQL 삽입 하나는 막지 못합니다. 그래서 보안을 「다 만든 뒤 점검」이 아니라 「만드는 과정 전체」에 넣는 제도와 방법론이 생겼고, 시험은 그 제도의 숫자와 보안 약점의 분류를 묻습니다.

  • SW 개발보안·보안약점·취약점의 뜻과 국내 제도의 기준(설계 20개·구현 49개)을 설명할 수 있다.
  • Secure SDLC 단계별 활동, MS-SDL·Seven Touchpoints·CLASP, STRIDE를 구분할 수 있다.
  • 입력데이터 검증·보안기능·에러처리·세션통제·코드오류·캡슐화·API 오용의 대표 약점과 대응을 짝지을 수 있다.

출제기준 위치: [4과목 정보시스템 구축관리 › 1. IT프로젝트 정보시스템 구축관리 › 2. SW 구축 관리 › SW개발보안 정책] · [2. 소프트웨어 개발 보안 구축 › 1. SW개발 보안 설계 · 2. SW개발 보안 구현]

💡 SW 개발보안 정책과 Secure SDLC

행정안전부·KISA의 「소프트웨어 개발보안 가이드」(2021)는 SW 개발보안을 개발 과정에서 개발자의 실수·논리적 오류로 생길 수 있는 보안 취약점·보안약점을 최소화해 안전한 소프트웨어를 만드는 일련의 보안 활동으로 정의합니다. 좁게는 구현 단계의 시큐어 코딩을 가리킵니다. 보안약점은 공격을 유발할 가능성이 있는 잠재적인 결함이고, 그것이 배포되어 실제로 악용할 수 있는 상태가 되면 취약점입니다.

국내 제도는 2012년 도입되어 단계적으로 의무화되었습니다. 대상은 감리 대상 정보시스템 사업이고, 신규 개발은 설계 산출물과 소스코드 전체, 유지보수는 변경분이 범위이며 상용 SW는 제외됩니다. 기준은 설계단계 보안설계 기준 20개(입력데이터 검증 및 표현 10·보안기능 8·에러처리 1·세션통제 1)와 구현단계 보안약점 제거 기준 49개(입력데이터 검증 및 표현 17·보안기능 16·시간 및 상태 2·에러처리 3·코드오류 5·캡슐화 4·API 오용 2)입니다. 감리법인이 도구를 쓸 때는 국가정보원의 CC 인증을 받은 진단도구를 씁니다.

Secure SDLC는 생명주기 단계마다 보안 활동을 더한 것입니다.

단계추가 보안 활동
요구사항 분석보안 요구사항 식별(기밀성·무결성·가용성 등급, 법적 관리 수준)
설계위협 모델링, 설계 20개 항목 반영
구현시큐어 코딩, 코드 리뷰·정적 분석
테스트동적 분석·모의 침투로 제거 여부 검증
유지보수사고 대응, 패치 관리, 교육

대표 방법론은 셋입니다. MS-SDL은 마이크로소프트가 자사 제품에 적용한 방법론으로 교육부터 대응까지의 단계와 위협 모델링·퍼징·보안 푸시가 특징입니다. Seven Touchpoints는 게리 맥그로가 정리한 것으로 기존 산출물에 코드 리뷰·아키텍처 위험 분석·침투 테스트·위험 기반 보안 테스트·오용 사례·보안 요구사항·보안 운영의 7개 접점을 붙입니다. CLASP는 OWASP의 활동 중심·역할 기반 프로세스(5가지 관점·24개 활동)로 이미 운영 중인 시스템에 적용하기 좋습니다. 위협 모델링 분류 STRIDE는 위장(Spoofing)·변조(Tampering)·부인(Repudiation)·정보 노출(Information disclosure)·서비스 거부(Denial of service)·권한 상승(Elevation of privilege)이며, 각각 인증·무결성·부인 방지·기밀성·가용성·인가 위반에 대응합니다.

💡 설계 기준 네 분류 — 입력·보안기능·에러·세션

입력데이터 검증 및 표현의 공통 원인은 검증하지 않은 외부 입력이 SQL·명령·스크립트·경로·URL의 일부로 해석되는 것입니다. 원칙은 허용 목록 검증과, 해석기로 넘어가는 지점마다 맞는 처리(바인딩·인코딩)를 하는 것입니다.

약점원리 → 대응
SQL 삽입입력이 SQL 문법으로 해석 → 파라미터 바인딩(PreparedStatement)
XSS스크립트가 피해자 브라우저에서 실행 → 출력 시 HTML 인코딩
CSRF로그인한 사용자 브라우저가 의도하지 않은 요청 전송 → 요청별 토큰 검증
SSRF서버가 공격자가 지정한 내부 주소로 요청 → 허용 URL·대상 목록
경로 조작../ 로 허용 밖 파일 접근 → 정규화 후 허용 범위 포함 검사
위험한 형식 파일 업로드웹셸 실행 → 확장자·크기 제한, 실행 권한 제거
포맷 스트링 삽입입력을 printf 형식으로 사용 → 형식 문자열은 상수("%s")

보안기능 약점은 인증 없는 중요기능 허용·부적절한 인가·반복 인증 시도 무제한, 취약한 암호 알고리즘·짧은 키·하드코드된 중요정보, 솔트 없는 일방향 해시, 예측 가능한 난수 사용 등입니다. 로그인만 확인하고 남의 주문을 조회하게 두면 인증은 있고 인가가 없는 상태입니다. 에러처리 약점은 스택 트레이스·SQL이 화면에 찍히는 오류 메시지 정보노출, 빈 catch처럼 예외를 잡고 아무것도 하지 않는 오류상황 대응 부재, 모든 예외를 최상위 Exception 하나로 뭉뚱그리는 부적절한 예외 처리의 3개입니다. 세션통제 설계 기준은 세션 간 데이터 공유 금지, 추측 불가능한 세션ID, 로그인 성공 시 세션ID 재발급(세션 고정 공격 방지), 만료, Secure·HttpOnly 쿠키를 요구합니다.

💡 구현 기준 — 코드오류·캡슐화·API 오용

코드오류 5개는 Null Pointer 역참조(사용 전 검사), 부적절한 자원 해제(Java try-with-resources, Python with), 해제된 자원 사용(free 뒤 포인터에 NULL), 초기화되지 않은 변수 사용, 신뢰할 수 없는 데이터의 역직렬화(Java 기본 직렬화·pickle 대신 JSON 같은 데이터 전용 형식)입니다.

캡슐화 4개는 공유 객체의 멤버 변수에 사용자별 데이터를 담아 다른 요청이 읽게 되는 「잘못된 세션에 의한 데이터 정보노출」, 배포본에 남은 디버그 코드, 그리고 배열 참조 문제 두 가지입니다. private 배열을 public 메서드가 그대로 반환하면 호출자가 참조를 받아 내부를 바꿀 수 있습니다.

import java.util.Arrays;

public class Q22 {
    public static void main(String[] args) {
        Course c = new Course();
        int[] s = c.getScores();
        s[0] = 100;
        System.out.println(Arrays.toString(c.getScores()));
    }
}

class Course {
    private int[] scores = {70, 80, 90};
    public int[] getScores() { return scores; }
}
[100, 80, 90]

바깥에서 고친 값이 객체 내부에 그대로 반영되었습니다. 이것이 「Public 메소드부터 반환된 Private 배열」이고, 대응은 scores.clone() 같은 복사본 반환입니다. 반대로 외부 배열을 private 필드에 그대로 대입하면 「Private 배열에 Public 데이터 할당」이며 대응은 역시 복사입니다.

API 오용은 2개뿐입니다. 도메인 이름 조회 결과로 신뢰를 판단하는 DNS lookup에 의존한 보안결정(IP 허용 목록·인증서로 대체), gets·strcpy처럼 경계 검사가 없는 취약한 API 사용(fgets·snprintf로 대체, gets는 C11에서 삭제)입니다. 검사와 사용 사이 틈을 노리는 TOCTOU 경쟁조건과 종료되지 않는 반복·재귀는 「시간 및 상태」 분류입니다.

⚠️ 시험에 나오는 함정

  • 숫자: 설계 20개(4분류), 구현 49개(7분류). 「시간 및 상태」는 구현 기준에만 있습니다.
  • XSS vs CSRF vs SSRF: 실행 위치가 브라우저(XSS), 요청 주체가 피해자 브라우저(CSRF), 요청 주체가 서버(SSRF)입니다.
  • 세션 정보노출의 분류: 「잘못된 세션에 의한 데이터 정보노출」은 세션통제가 아니라 캡슐화입니다.
  • STRIDE의 R은 Replay가 아니라 Repudiation(부인)입니다.
  • 방법론: 운영 중 시스템·역할 기반은 CLASP, 7개 접점·오용 사례는 Seven Touchpoints, 보안 푸시는 MS-SDL입니다.

📝 핵심 요약 — 암기표

주제한 줄 정리
제도2012년 도입, 감리 대상 사업, 상용 SW 제외, CC 인증 진단도구
기준설계 20(입력 10·보안기능 8·에러 1·세션 1) / 구현 49(17·16·2·3·5·4·2)
Secure SDLC보안 요구사항 → 위협 모델링 → 시큐어 코딩·정적 분석 → 동적 분석·모의 침투 → 패치
STRIDE위장·변조·부인·정보 노출·서비스 거부·권한 상승
입력 검증SQL 삽입→바인딩, XSS→인코딩, CSRF→토큰, SSRF→허용 목록
구현 3분류코드오류 5 / 캡슐화 4(배열은 복사) / API 오용 2(DNS 의존·취약 API)

이 주제의 자세한 이론과 실전문제 8문항은 필기+실기 과정 혜택 교재 「정보처리기사 필기 완전정복 50강」의 42·43·44강에서 다룹니다.

다음 23강 「암호 알고리즘과 서비스 공격 유형」에서는 보안기능 약점의 바탕인 대칭키·공개키·해시와, 서비스를 멈추게 하는 공격 유형을 정리합니다.

📋 확인 문제

  1. 설계단계 보안설계 기준(20개 항목)의 분류에 해당하지 않는 것은?
    ① 입력데이터 검증 및 표현 ② 보안기능 ③ 세션통제 ④ 코드오류
  2. 온라인 송금 후 사용자가 「나는 이체를 요청한 적이 없다」고 주장해도 반박할 기록이 없다. STRIDE에서 이 위협의 분류는?
    ① Repudiation ② Spoofing ③ Tampering ④ Information disclosure
  3. 다음 Java 프로그램의 출력과, 이 코드에 있는 보안약점을 바르게 짝지은 것은?
    public class Q22b {
        public static void main(String[] args) {
            int[] a = {1, 2, 3};
            Box b = new Box();
            b.setData(a);
            a[0] = 9;
            System.out.println(b.first());
        }
    }
    
    class Box {
        private int[] data;
        public void setData(int[] d) { data = d; }
        public int first() { return data[0]; }
    }
    ① 1 — Public 메소드부터 반환된 Private 배열 ② 9 — Public 메소드부터 반환된 Private 배열 ③ 9 — Private 배열에 Public 데이터 할당 ④ 1 — 해제된 자원 사용
  4. 게시판의 「링크 미리보기」 기능에 공격자가 외부 URL 대신 내부망 관리 페이지 주소를 넣자, 웹 서버가 그 주소로 직접 요청을 보내 응답을 화면에 보여 주었다. 이 보안약점은?
    ① 크로스사이트 스크립트 ② 서버사이드 요청 위조 ③ 크로스사이트 요청 위조 ④ HTTP 응답분할
  5. OWASP 프로젝트로 공개된 활동 중심·역할 기반 프로세스로, 이미 운영 중인 시스템에 적용하기 좋은 개발보안 방법론은?
    ① CLASP ② MS-SDL ③ Seven Touchpoints ④ 폭포수 모델

✅ 정답과 해설

  1. 정답 ④ — 설계 기준은 입력데이터 검증 및 표현·보안기능·에러처리·세션통제의 4분류입니다. 코드오류는 구현단계 49개 기준(7분류)에만 있는 분류입니다.
  2. 정답 ① — 행위를 하고도 하지 않았다고 주장하는 것이 부인(Repudiation)이며, 감사 로그·전자서명 같은 부인 방지로 대응합니다. Spoofing은 남으로 위장, Tampering은 데이터 변조, Information disclosure는 기밀 노출입니다.
  3. 정답 ③ — setData()가 외부 배열의 참조를 private 필드에 그대로 대입했으므로, 호출자가 a[0]을 9로 바꾸자 객체 내부의 data[0]도 9가 됩니다. 외부 데이터를 「받아 넣은」 경우라 할당 쪽 약점이며, 대응은 d.clone() 같은 복사본 저장입니다. ②의 「반환」은 내부 배열을 내보내는 경우이고, ①④는 출력부터 틀립니다.
  4. 정답 ② — 요청을 보내는 주체가 서버이고 대상이 공격자가 지정한 내부 주소이므로 SSRF입니다. XSS는 스크립트가 브라우저에서 실행되고, CSRF는 피해자 브라우저가 요청을 보내며, HTTP 응답분할은 헤더에 개행 문자를 넣는 공격입니다.
  5. 정답 ① — 활동 중심·역할 기반, 운영 중 시스템 적용은 CLASP의 특징입니다. MS-SDL은 마이크로소프트의 단계형 방법론, Seven Touchpoints는 7개 보안 접점, 폭포수 모델은 보안 방법론이 아니라 일반 개발 생명주기 모델입니다.

📚 참고 자료

관련 주제

  • SW 개발보안
  • 보안약점
  • Secure SDLC
  • STRIDE
  • SQL 삽입
  • XSS
  • CSRF
  • SSRF
  • 캡슐화
  • 시큐어 코딩
  • 자격증
  • 자격증 강의
  • 정보처리기사 필기 25강 — 2027 출제기준 핵심 요약
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

정보처리기사 필기 25강 — 2027 출제기준 핵심 요약

이 강의가 속한 시리즈는 총 25강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...