Skip to content
난이도 출제 빈출문제은행 5

보안 3요소와 시큐어 코딩 ​

시큐어 코딩(secure coding)은 개발 단계에서 보안 약점을 만들지 않도록 코드를 짜는 방법이다. 배포한 뒤에 구멍을 막는 것보다 처음부터 막는 편이 훨씬 싸기 때문에, 국내에서는 KISA(Korea Internet & Security Agency, 한국인터넷진흥원)가 소프트웨어 개발보안 가이드로 기준을 제시한다. 시험은 보안 3요소의 정의, SQL 삽입(SQL injection)과 스택 가드(stack guard)의 이름, Java 접근 제어자(access modifier)의 접근 범위 표를 자주 묻는다.

보안 3요소 ​

보안이 지키려는 성질은 세 가지로 정리된다. 영어 머리글자를 따서 CIA(Confidentiality, Integrity, Availability) 삼원칙이라고도 부른다. 세 가지 중 하나라도 무너지면 "보안 사고"가 된다.

요소뜻깨진 예
기밀성(confidentiality)인가된 사람만 정보를 볼 수 있다전송 중 비밀번호 노출
무결성(integrity)인가된 사람만 정보를 고칠 수 있다계좌 금액 위조
가용성(availability)인가된 사람은 언제든 쓸 수 있다서비스 거부 공격(Denial of Service)으로 접속 불가

함께 나오는 개념으로, 인증(authentication)은 사용자가 주장하는 그 사람이 맞는지 확인하는 일이고, 부인 방지(non-repudiation)는 보내거나 받은 사람이 나중에 그 사실을 잡아떼지 못하도록 증거를 남기는 일이다.

SQL 삽입 ​

SQL 삽입(SQL injection)은 사용자가 입력한 값이 SQL 문의 일부로 해석되어 개발자가 의도하지 않은 쿼리가 실행되는 보안 약점이다. 로그인 화면에서 비밀번호 칸에 ' OR '1'='1 같은 값을 넣으면, 입력을 문자열로 이어 붙여 만든 쿼리에서는 조건이 항상 참이 되어 인증을 우회할 수 있다. 그래서 데이터 유출·변조나 관리자 인증 우회로 이어진다.

막는 방법은 입력을 코드가 아니라 값으로만 다루는 것이다. 가장 확실한 것은 쿼리 틀을 먼저 고정하고 값은 나중에 끼워 넣는 매개변수 바인딩(parameter binding)이다. Java에서는 PreparedStatement가 이 방식을 쓴다. 여기에 더해 입력값의 형식·길이를 검사하고, 특수문자를 필터링하며, DB 계정 권한을 최소로 준다.

스택 가드 ​

스택 가드(stack guard)는 스택 버퍼 오버플로(stack buffer overflow)를 막는 기술이다. 버퍼 오버플로는 정해진 크기보다 긴 입력이 버퍼 뒤의 메모리까지 덮어쓰는 문제인데, 스택에서는 함수가 끝나고 돌아갈 복귀 주소가 덮여 공격자가 원하는 코드로 실행 흐름이 넘어갈 수 있다.

스택 가드는 버퍼와 복귀 주소 사이에 카나리(canary)라는 특정 값을 넣어 두고, 함수가 돌아가기 직전에 그 값이 바뀌었는지 확인한다. 넘친 입력은 복귀 주소보다 카나리를 먼저 덮으므로 값이 바뀌었으면 오버플로로 판단해 프로그램을 멈춘다. 그래서 잘못된 복귀 주소로 점프하는 일을 막는다. 비슷한 목적의 스택 실드(stack shield)는 함수가 시작될 때 복귀 주소를 별도 공간에 복사해 두었다가, 함수가 끝날 때 그 사본으로 복귀 주소를 되살린다.

접근 제어자 ​

접근 제어자(access modifier)는 클래스의 멤버를 어디서 쓸 수 있는지 제한하는 예약어다. 밖에서 건드리면 안 되는 데이터를 감추어 잘못된 수정을 막으므로, 시큐어 코딩에서는 필드를 private으로 두고 메서드로만 접근하게 하라고 권한다. Java의 네 가지는 다음 범위를 가진다. default는 키워드를 쓰지 않았을 때의 기본 접근이다.

제어자클래스 내부같은 패키지다른 패키지 하위 클래스다른 패키지
publicOOOO
protectedOOOX
defaultOOXX
privateOXXX

위 표는 javac 21로 네 경우를 각각 컴파일해 확인했다.

시험 포인트 ​

  • 허가 없이 못 고침 → 무결성. 허가 없이 못 봄 → 기밀성. 필요할 때 쓸 수 있음 → 가용성.
  • 입력값이 쿼리의 일부로 해석, 정보 유출·인증 우회 → SQL 삽입. 대책: 매개변수 바인딩, 입력 검증.
  • 카나리 값, 변조되면 실행 중단 → 스택 가드. 복귀 주소 사본 → 스택 실드.
  • 같은 패키지만 → default, 다른 패키지라도 하위 클래스면 → protected.

관련 문서