개발보안읽는 시간 9분·국내 개발보안 기준

소스코드 보안 진단 가이드
시큐어코딩 보안약점 점검

공공·금융 정보시스템은 소스코드 단계에서 보안약점을 제거하도록 요구받습니다. 이 문서는 보안약점이 어떤 유형으로 나뉘는지, 진단 결과를 감사·개발 실무에서 어떻게 활용하는지, 오픈소스 컴포넌트와 라이선스를 어떤 관점으로 검토해야 하는지 정리합니다.

왜 소스코드 진단이 의무가 되었나

공공부문은 일정 규모 이상의 정보화사업에 소프트웨어 개발보안(시큐어코딩) 적용이 의무입니다. 사업 종료 시 진단을 수행하고 발견된 보안약점을 제거해야 검수가 완료됩니다.

금융권은 전자금융 관련 감독기준의 정보처리시스템 보호대책과 취약점 평가가 근거가 되고, 개인정보를 처리하는 시스템이라면 개인정보 보호 법령의 접근통제·암호화 요구가 함께 적용됩니다.

실무 관점: 발주기관이 요구하는 것은 결국 “문제가 되는 파일과 라인, 왜 문제인지, 어떻게 고치는지”가 명확한 산출물입니다. 항목 이름만 나열한 보고서는 개발팀이 받아도 무엇을 해야 할지 알 수 없어 조치로 이어지지 않습니다.

보안약점의 7개 유형

국내 개발보안 기준은 구현 단계에서 제거해야 할 보안약점을 아래 일곱 가지 유형으로 나눕니다. 유형을 알면 발견사항이 개별 실수인지 설계 차원의 공백인지 구분할 수 있습니다. 같은 유형이 여러 파일에서 반복된다면 개발자 개인이 아니라 프로세스를 고쳐야 한다는 신호입니다.

입력데이터 검증 및 표현

외부 입력값을 검증 없이 질의문·명령어·화면 출력에 사용해 발생하는 유형. 실제 침해사고에서 가장 많이 악용된다.

보안기능

인증·인가·암호화·권한 관리를 부적절하게 구현해 발생하는 유형. 코드만 봐도 기준 위반이 확정되는 항목이 많다.

시간 및 상태

동시 수행·자원 공유 환경에서 검사 시점과 사용 시점의 차이로 발생하는 유형.

에러처리

오류 상황을 적절히 처리하지 않아 내부 정보가 노출되거나 예상치 못한 동작이 발생하는 유형.

코드오류

자원 관리·초기화·역직렬화 과정의 구현 실수에서 비롯되는 유형.

캡슐화

중요 데이터·기능을 불충분하게 캡슐화해 비인가 접근이 가능해지는 유형.

API 오용

API를 의도와 다르게 사용하거나 안전하지 않은 API를 사용해 발생하는 유형.

정적 진단과 동적 진단의 관계

공공기관 홈페이지 진단 과업은 대개 표준 웹 취약점 점검항목 체계로 보고서를 요구합니다. 이 체계는 실행 중인 웹 애플리케이션을 대상으로 하는 동적 진단 관점이고, 개발보안 기준의 보안약점은 소스코드를 대상으로 하는 정적 진단 관점입니다.

같은 취약점이라도 접근 방식이 다릅니다. 예를 들어 SQL 인젝션은 동적 진단에서는 “페이로드를 넣었더니 오류가 났다”로, 정적 진단에서는 “42행에서 파라미터가 문자열 연결로 질의문에 들어간다”로 확인됩니다. 정적 진단은 도달 경로 전체를 볼 수 있어 누락이 적고, 동적 진단은 실제 악용 가능성을 입증합니다.두 진단은 대체 관계가 아니라 보완 관계입니다.

보고서 작성 팁: 소스코드 진단 결과를 제출할 때 발견된 보안약점을 발주기관의 점검항목 체계로 대응시킨 표를 함께 넣으면 검수 양식에 그대로 얹을 수 있습니다. 소스코드로는 확인할 수 없는 항목(서버 설정·운영 절차 등)은 범위 한계로 분명히 명시하십시오.

진단의 승부처는 오탐 제거다

정적 진단 도구가 신뢰를 잃는 이유는 거의 항상 오탐입니다. 수백 건이 쏟아지면 개발팀은 전부 무시하게 되고, 그 안에 섞인 진짜 취약점도 함께 묻힙니다. 위험한 함수가 쓰였다는 사실만으로 취약점이 되지는 않습니다.외부 입력이 그 지점에 실제로 도달하는지, 프레임워크나 라이브러리가 이미 막고 있지는 않은지까지 확인해야 발견사항으로 성립합니다.

확정할 수 있는 것과 판단이 필요한 것을 나눈다

자격증명이 코드에 박혀 있거나 안전하지 않은 암호 알고리즘을 쓴 경우는코드에 존재한다는 사실만으로 기준 위반이 확정됩니다. 반면 주입 계열 취약점은 외부 입력의 도달 여부에 성립이 달려 있어 경로를 함께 확인해야 합니다. 진단 결과에는 이 둘을 구분해 확신도를 표기하고 근거를 제시해야 개발팀이 반박이 아니라 조치로 응답합니다.

취약점만 보면 절반만 본 것이다

정적 진단 도구는 잘못 쓴 코드를 찾습니다. 그런데 감사에서 문제가 되는 것은 대부분 있어야 하는데 없는 코드입니다.

개인정보를 조회하는 화면이 이력을 남기지 않는다고 해서 공격자가 그것을 악용하지는 않습니다. 하지만 유출 사고가 났을 때 누가 언제 무엇을 조회했는지 증명할 수 없고, 그 순간 “통제가 없었다”는 결론으로 이어집니다. 보유기간이 지난 개인정보를 파기하는 배치가 없는 것, 권한 검증이 화면에만 있고 서버에는 없는 것, 결제 금액을 클라이언트가 보낸 값 그대로 처리하는 것도 마찬가지입니다.

감사증적·로깅

중요 데이터의 생성·변경·삭제·조회가 사후에 소명 가능한 형태로 남는가

개인정보 생명주기

보유기간 정책대로 파기되는가, 연관 테이블·백업에 사본이 남지 않는가

접근통제·직무분리

권한 검증이 서버에서 이뤄지는가, 한 사람이 신청과 승인을 모두 할 수 있는가

암호화 대상

법령이 암호화를 요구하는 항목이 실제로 암호화되어 저장·전송되는가

거래 무결성

금액·수량이 서버에서 재계산되는가, 중복 처리와 부인이 통제되는가

데이터 정합성

참조무결성이 DB 제약으로 보장되는가, 코드에만 의존하는가

스키마를 같이 보면 달라집니다: 소스코드만으로는 “참조무결성을 애플리케이션이 지키고 있다”는 사실을 알 수 없습니다. DDL을 함께 검토하면 외래키 부재로 고아 레코드가 생길 수 있는 구조인지, 주민등록번호 컬럼이 평문 저장을 전제한 길이인지, 이력 테이블이 변조 가능한지까지 확인됩니다.

오픈소스 컴포넌트·라이선스 검토

직접 작성한 코드가 안전해도 가져다 쓴 라이브러리가 취약하면 시스템은 취약합니다. Log4Shell처럼 단일 컴포넌트가 전 산업에 영향을 준 사례가 이를 보여줍니다. 금융권 오픈소스 관리 기준은 대체로 아래 단계를 권고합니다.

도입 전

기능성·라이선스·보안성·커뮤니티 활성도(최종 릴리즈 시점)를 기준으로 선정 심의

개발 전

CVE·NVD 공개 취약점 확인, 상호 충돌하는 라이선스 존재 여부 검토

개발 중·후

SCA로 컴포넌트·스니펫 다중 검사, 고지의무 이행(NOTICE·라이선스 전문 동봉)

운영 중

SBOM 최신화, 보안팀의 CVE 모니터링, 보안패치 적용 이력 관리

라이선스 의무 — 소스 공개 의무가 어디서 생기는가

라이선스구분핵심 의무
AGPL-3.0강한 카피레프트네트워크로 서비스만 제공해도 소스 공개 의무가 발생. SaaS에서 가장 위험하다.
GPL-2.0 / 3.0강한 카피레프트링크·결합한 저작물 전체의 소스 공개 의무. 외부 배포 시 특히 주의.
LGPL-2.1 / 3.0약한 카피레프트동적 링크는 본체 공개 의무 없음. 정적 링크·수정 시 의무 발생.
MPL-2.0 / EPL-2.0약한 카피레프트수정한 파일 단위로만 공개 의무.
SSPL / BUSL오픈소스 아님OSI 승인 라이선스가 아니다. 상용 이용 조건을 별도로 확인해야 한다.
Apache-2.0허용적고지·변경사항 명시·NOTICE 유지, 특허 허여. GPL-2.0과는 양립 불가.
MIT / BSD / ISC허용적저작권 고지와 라이선스 전문 포함이 의무의 전부.

감사인이 진단 결과를 쓰는 순서

1

심각도가 아니라 도달 가능성으로 우선순위를 잡는다

인증 없이 외부에서 도달 가능한 Critical부터 처리한다. 내부망 전용 배치 프로그램의 Critical보다 대민 서비스의 High가 먼저다.

2

근본 원인 단위로 묶어 지적한다

"42행 SQL 삽입"을 30건 나열하는 것보다 "DAO 계층 전체가 문자열 연결로 질의문을 생성한다"가 조치를 이끌어낸다.

3

조치 요구는 코드로 제시한다

"입력값 검증 강화 필요"는 개발팀이 받아도 무엇을 할지 모른다. 같은 프레임워크의 수정 코드를 함께 준다.

4

재진단으로 조치를 확인한다

조치 완료 보고만으로 종결하지 않는다. 같은 범위를 다시 진단해 해당 발견사항이 사라졌는지 확인한 기록을 남긴다.

5

범위 한계를 명시한다

소스코드로 확인할 수 없는 서버 설정·인프라 구성·운영 절차는 진단 대상이 아님을 보고서에 분명히 적는다.

Verit Audit

소스 파일을 올리면 보안약점을 진단합니다

문제가 되는 파일과 라인, 왜 문제인지, 어떻게 고치는지를 함께 제시하고 자체 검증 절차로 오탐을 걸러냅니다. 코드에 박힌 비밀정보는 AI 전송 전에 서버에서 값을 치환하므로 값 자체는 외부로 나가지 않습니다.

소스코드 진단 실행해보기