출제기준 세세항목: Secure SDLC(Software Development Life Cycle) · 입력데이터 검증 및 표현 · 보안기능(인증, 접근제어, 기밀성, 권한 관리 등) · 에러처리 · 세션통제
보안이라고 하면 해커를 막는 장면부터 떠오르지만, 결국 지키려는 것은 세 가지 성질로 정리됩니다. 기밀성(Confidentiality)은 허락받은 사람만 정보를 볼 수 있어야 한다는 것입니다. 무결성(Integrity)은 정보가 허락된 사람에 의해, 허락된 방법으로만 바뀌어야 한다는 것입니다. 가용성(Availability)은 권한 있는 사용자가 필요할 때 지체 없이 정보와 시스템을 쓸 수 있어야 한다는 것입니다. 세 단어의 영문 첫 글자를 따서 CIA라고 부릅니다.
편지로 비유해 보겠습니다. 봉투를 밀봉해 남이 못 읽게 하는 것은 기밀성, 중간에 누가 내용을 고쳐 쓰지 못하게 하는 것은 무결성, 우체국이 문을 닫지 않고 늘 편지를 받아 주는 것은 가용성입니다. 공격도 이 기준으로 나눠 볼 수 있습니다. 엿듣기는 기밀성을, 위·변조는 무결성을, 서비스 거부 공격은 가용성을 해칩니다.
3요소에 덧붙여 자주 나오는 요소가 두 가지 있습니다. 인증(Authentication)은 접속한 사람이 자신이 주장하는 그 사람이 맞는지 확인하는 것이고, 부인방지(Non-repudiation)는 메시지를 보내거나 거래를 한 사람이 나중에 '나는 그런 적 없다'고 잡아뗄 수 없게 증거를 남기는 것입니다. 전자서명이 부인방지의 대표 수단입니다.
인증은 무엇을 근거로 확인하느냐에 따라 나뉩니다. 비밀번호·PIN처럼 사용자가 알고 있는 것으로 확인하는 지식 기반, OTP 생성기·스마트카드·보안 토큰처럼 가지고 있는 것으로 확인하는 소유 기반, 지문·홍채·얼굴처럼 몸의 특징으로 확인하는 생체 기반이 기본 세 가지이고, 서명 습관이나 걸음걸이 같은 행위 특징을 쓰는 행위 기반도 있습니다. 서로 다른 종류를 두 가지 이상 함께 쓰면 다중 요소 인증(MFA)이라고 하며, 비밀번호 하나가 새어 나가도 바로 뚫리지 않습니다.
다 만든 프로그램에 마지막에 보안을 덧칠하려 하면 구조를 뜯어고쳐야 하는 일이 생깁니다. 집을 다 지은 뒤 벽을 허물고 금고를 넣는 것과 같습니다. Secure SDLC(Software Development Life Cycle)는 개발 생명주기의 모든 단계에 보안 활동을 함께 넣어, 처음부터 안전한 소프트웨어를 만들자는 접근입니다.
단계별로 보면 이렇습니다. 요구사항 단계에서는 어떤 정보를 어떤 수준으로 보호해야 하는지 보안 요구사항을 정합니다. 설계 단계에서는 예상되는 위협을 따져 보고(위협 모델링) 그에 맞는 보안 기능을 설계에 담습니다. 구현 단계에서는 보안 약점이 생기지 않도록 정해진 규칙대로 코드를 쓰는데, 이것을 시큐어 코딩이라고 합니다. 테스트 단계에서는 소스 코드를 실행하지 않고 훑는 정적 분석과 실제로 실행하며 공격을 흉내 내는 동적 분석으로 취약점을 찾고, 운영·유지보수 단계에서는 새로 알려진 취약점을 패치합니다.
Secure SDLC를 구체적인 절차로 정리한 방법론도 알아 두어야 합니다. CLASP(Comprehensive, Lightweight Application Security Process)는 웹 보안 비영리 단체인 OWASP가 제안한 것으로, 개념·역할 기반·활동 평가·활동 구현·취약성의 다섯 가지 관점으로 보안 활동을 정리하고 각 활동을 프로젝트 안의 역할에 연결합니다. MS-SDL은 마이크로소프트가 자사 제품 개발에 적용하며 다듬은 보안 개발 생명주기입니다. Seven Touchpoints는 실무에서 효과가 검증된 일곱 가지 보안 활동(코드 검토, 위험 분석, 침투 테스트 등)을 기존 개발 단계 곳곳에 끼워 넣는 방법론입니다.
설계 단계에서 보안 요구사항을 정할 때는 크게 네 무리로 나눠 점검합니다. 입력데이터 검증 및 표현, 보안기능, 에러처리, 세션통제입니다. 구현 단계에는 이와 별도로 일곱 가지 보안 약점 유형 목록이 있는데, 이름이 일부 겹칠 뿐 서로 다른 목록이므로 섞어 외우지 않도록 주의합니다. 그 내용은 'SW개발 보안 구현' 항목에서 다룹니다.
입력데이터 검증 및 표현은 사용자나 외부 시스템에서 들어오는 모든 값을 믿지 말고, 형식·길이·허용 문자를 검사한 뒤에 쓰도록 설계하는 것입니다. 데이터베이스 질의, 파일 경로, 운영체제 명령, 화면 출력처럼 입력값이 흘러가는 곳마다 어떤 검증을 할지 미리 정합니다. 검증은 브라우저 쪽에서만 하면 쉽게 우회되므로 반드시 서버 쪽에서 해야 합니다.
보안기능은 인증, 접근제어, 기밀성(암호화), 권한 관리처럼 보안을 위해 따로 만드는 기능입니다. 누가 어떤 방식으로 로그인하는지, 로그인 실패를 몇 번까지 허용하는지, 중요한 기능은 어떤 권한이 있어야 쓸 수 있는지, 비밀번호와 중요 정보는 어떻게 저장하고 전송하는지, 암호키는 어디에 보관하는지를 설계에서 정합니다.
에러처리는 오류가 났을 때 시스템이 엉뚱한 상태에 빠지거나, 오류 메시지에 서버 경로·DB 구조 같은 내부 정보가 드러나지 않도록 처리 방식을 정하는 것입니다. 세션통제는 로그인한 뒤 사용자를 알아보는 표(세션)를 안전하게 만들고, 일정 시간 쓰지 않으면 끊고, 로그아웃하면 확실히 없애도록 설계하는 것입니다. 세션을 허술하게 다루면 공격자가 남의 세션을 가로채 그 사람인 척할 수 있습니다.
접근 통제는 주체(사용자나 프로그램)가 객체(파일, 데이터, 장치 같은 자원)에 접근하려 할 때 허용할지 말지를 정하는 일입니다. 순서는 보통 식별(나는 누구다), 인증(정말 그 사람이 맞는지 확인), 인가(그 사람에게 허락된 일만 하게 함), 책임 추적(무엇을 했는지 기록)으로 이어집니다. 인증(Authentication), 인가(Authorization), 기록·계정 관리(Accounting)의 첫 글자를 따서 AAA라고 부르기도 합니다.
임의적 접근 통제(DAC, Discretionary Access Control)는 자원의 주인이 자기 재량으로 다른 사람에게 권한을 주고 뺏는 방식입니다. 내 문서를 누구와 공유할지 내가 정하는 것과 같습니다. 사용자의 신원을 기준으로 판단하며, 자원마다 누가 무엇을 할 수 있는지 적은 접근 제어 목록(ACL)을 많이 씁니다. 유연하지만 주인이 실수로 권한을 넓게 주면 그대로 퍼집니다.
강제적 접근 통제(MAC, Mandatory Access Control)는 자원마다 붙은 보안 등급(비밀, 대외비 같은 레이블)과 사용자가 받은 인가 등급을 시스템이 비교해 결정하는 방식입니다. 자원의 주인이라도 권한을 마음대로 넘기거나 바꿀 수 없습니다. 군대나 정부 기관처럼 보안 수준이 높은 곳에 맞습니다. 참고로 암호에서 쓰는 메시지 인증 코드(Message Authentication Code)도 약어가 MAC이라 헷갈리기 쉬우니, 문제의 맥락으로 구별하세요.
역할 기반 접근 통제(RBAC, Role-Based Access Control)는 사람에게 권한을 하나하나 주지 않고, '인사 담당', '회계 담당' 같은 역할에 권한 묶음을 정해 둔 뒤 사람을 역할에 배정하는 방식입니다. 부서를 옮기면 역할 배정만 바꾸면 되니 사람이 많고 이동이 잦은 조직에서 관리가 쉽습니다. 일에 필요한 만큼만 권한을 주는 최소 권한 원칙과, 한 사람이 중요한 일을 혼자 처음부터 끝까지 처리하지 못하게 나누는 직무 분리 원칙을 적용하기에도 좋습니다.
강제적 접근 통제를 구체적인 규칙으로 만든 것이 보안 모델입니다. 시험에 가장 자주 나오는 두 모델은 방향이 정반대라 한 쌍으로 외우는 것이 좋습니다.
벨-라파듈라(BLP, Bell-LaPadula) 모델은 미 국방부의 군사 기밀 보호를 위해 정리된 모델로, 기밀성을 지키는 데 초점을 둡니다. 규칙은 두 가지입니다. 자기보다 높은 등급의 정보는 읽을 수 없고(No Read Up), 자기보다 낮은 등급의 문서에는 쓸 수 없습니다(No Write Down). 장교가 일반 병사용 게시판에 기밀을 적어 버리면 정보가 아래로 새기 때문에, 아래쪽으로 쓰기를 막는다고 이해하면 됩니다.
비바(Biba) 모델은 무결성을 지키는 데 초점을 둔 모델로, 규칙이 벨-라파듈라와 거꾸로입니다. 자기보다 낮은 등급의 정보는 읽지 않고(No Read Down), 자기보다 높은 등급의 정보에는 쓸 수 없습니다(No Write Up). 믿을 수 없는 낮은 등급의 정보가 믿을 만한 높은 등급의 정보를 더럽히지 못하게 막는 것입니다. '기밀성은 벨-라파듈라, 무결성은 비바'를 먼저 떠올린 뒤 규칙의 방향을 맞추면 헷갈리지 않습니다.
이 밖에 상업 환경에서 무결성을 지키기 위해 정해진 절차(잘 짜인 트랜잭션)와 직무 분리를 강조하는 클락-윌슨(Clark-Wilson) 모델, 서로 경쟁하는 고객사의 정보를 한 사람이 함께 보지 못하게 해 이해 충돌을 막는 만리장성(Chinese Wall, 브루어-내시) 모델도 있습니다.
대칭키 암호는 잠글 때와 열 때 같은 키를 씁니다. 집 열쇠 하나로 문을 잠그고 여는 것과 같습니다. 속도가 빨라 많은 데이터를 암호화하기에 좋지만, 상대에게 키를 안전하게 건네는 일이 어렵고 사람이 늘수록 키가 많이 필요합니다. n명이 서로 짝지어 통신하려면 n(n-1)/2개의 키가 필요합니다. 데이터를 일정 크기 덩어리로 나눠 처리하는 블록 암호와, 한 비트·한 바이트씩 흘려보내며 처리하는 스트림 암호(RC4 등)로 다시 나뉩니다.
대표 블록 암호를 정리하면 이렇습니다. DES는 미국 표준이었던 알고리즘으로 64비트 블록에 실제로 쓰이는 키는 56비트라 지금은 안전하지 않다고 봅니다. DES를 세 번 겹친 3DES를 거쳐, 미국 국립표준기술연구소(NIST)가 후속 표준으로 정한 것이 AES입니다. AES는 128비트 블록에 128·192·256비트 키를 고를 수 있습니다. 국내에서 만든 것으로는 한국인터넷진흥원(KISA)이 개발한 SEED와, 국가보안기술연구소가 중심이 되어 학계(Academy)·연구소(Research Institute)·정부 기관(Agency)이 함께 만들어 이름도 그 첫 글자에서 딴 ARIA가 있습니다. 이 밖에 IDEA, 국내의 경량 암호 LEA도 대칭키입니다.
비대칭키(공개키) 암호는 누구에게나 알려 주는 공개키와 나만 가진 개인키를 쌍으로 씁니다. 공개키로 잠근 것은 짝이 되는 개인키로만 열 수 있으므로, 키를 미리 몰래 건넬 필요가 없습니다. n명이면 사람마다 한 쌍씩 2n개의 키면 됩니다. 대신 계산이 무거워 느립니다. RSA는 아주 큰 두 소수를 곱한 수를 소인수분해하기 어렵다는 성질에 기댄 알고리즘으로, 만든 세 사람의 성 첫 글자를 땄습니다. ECC(타원곡선 암호)는 타원곡선 위의 이산대수 문제를 이용해 RSA보다 짧은 키로 비슷한 안전성을 냅니다. 이산대수 문제에 기대는 엘가말(ElGamal), 키를 안전하게 나눠 갖는 방법인 디피-헬만(Diffie-Hellman) 키 교환도 이 계열입니다. 내 개인키로 서명하고 남이 내 공개키로 확인하는 전자서명도 비대칭키의 쓰임입니다.
해시는 입력을 고정된 길이의 값으로 바꾸는 함수로, 결과에서 원래 값을 되돌려 낼 수 없는 일방향이라는 점이 핵심입니다. 입력이 조금만 달라져도 결과가 크게 바뀌어, 데이터가 바뀌었는지 확인(무결성 검증)하거나 비밀번호를 저장하는 데 씁니다. MD5(128비트 출력)와 SHA-1(160비트 출력)은 서로 다른 입력이 같은 결과를 내는 충돌이 실제로 찾아져 더는 권장하지 않고, 지금은 SHA-256 같은 SHA-2 계열을 씁니다. 비밀번호를 해시할 때는 사용자마다 다른 무작위 값인 솔트(Salt)를 덧붙여, 같은 비밀번호라도 결과가 달라지게 만듭니다.
서비스 거부 공격(DoS, Denial of Service)은 시스템의 자원을 고갈시켜 정상 사용자가 서비스를 쓰지 못하게 만드는 공격으로, 가용성을 노립니다. 악성코드에 감염된 수많은 좀비 PC(이들을 묶은 것을 봇넷이라 합니다)를 원격으로 조종해 한꺼번에 공격하면 분산 서비스 거부 공격(DDoS)이 됩니다. 수법별 이름도 알아 두세요. SYN 플러딩은 TCP 연결 요청(SYN)만 잔뜩 보내고 마지막 확인 응답을 보내지 않아 서버의 대기 공간을 채웁니다. 스머프(Smurf)는 출발지를 피해자 주소로 위조한 ICMP 요청을 브로드캐스트 주소로 보내 응답이 피해자에게 쏟아지게 합니다. 죽음의 핑(Ping of Death)은 허용 크기를 넘는 ICMP 패킷을 조각내 보내 재조립하다 탈이 나게 하고, 랜드 어택(Land Attack)은 출발지와 목적지를 모두 피해자 주소로 맞춰 자기 자신에게 계속 응답하게 하며, 티어드롭(Teardrop)은 조각 패킷의 순서 정보(오프셋)를 겹치게 조작해 재조립을 방해합니다.
엿듣고 속이는 공격도 있습니다. 스니핑(Sniffing)은 네트워크를 지나가는 패킷을 몰래 엿보는 수동적인 공격으로, 암호화되지 않은 비밀번호가 그대로 새어 나갈 수 있습니다. 스푸핑(Spoofing)은 자신을 다른 대상인 것처럼 속이는 공격입니다. IP 주소를 위조하는 IP 스푸핑, 내부망에서 MAC 주소 정보를 속여 남의 트래픽을 자기에게 오게 만드는 ARP 스푸핑, 도메인 질의에 가짜 IP 주소로 응답하는 DNS 스푸핑이 있습니다. 로그인된 사용자의 세션 정보를 가로채 그 사용자인 척하는 것은 세션 하이재킹입니다.
사람을 속이는 공격도 이름을 정확히 구별해야 합니다. 피싱(Phishing)은 은행이나 쇼핑몰을 사칭한 메일·사이트로 개인정보와 금융 정보를 낚아 가는 수법입니다. 파밍(Pharming)은 DNS나 PC의 호스트 파일을 변조해, 사용자가 주소를 정확히 입력해도 가짜 사이트로 가게 만듭니다. 문자 메시지(SMS)를 이용하면 스미싱, 음성 전화를 이용하면 보이스 피싱이라고 합니다.
웹 애플리케이션을 노리는 공격은 실기에서 특히 자주 묻습니다. SQL 인젝션(SQL Injection, SQL 삽입)은 입력값을 그대로 이어 붙여 질의문을 만드는 점을 노려, 항상 참이 되는 조건이나 주석 기호를 끼워 넣어 인증을 우회하거나 데이터를 빼냅니다. 크로스 사이트 스크립팅(XSS, Cross-Site Scripting)은 게시글 등에 악성 스크립트를 심어 그 페이지를 연 다른 사용자의 브라우저에서 실행되게 하고, 쿠키나 세션 정보를 훔칩니다. 사이트 간 요청 위조(CSRF, Cross-Site Request Forgery)는 로그인한 사용자가 모르는 사이에 비밀번호 변경이나 송금 같은 요청을 서버로 보내게 만듭니다. 악성코드로는 숙주 파일에 붙어 퍼지는 바이러스, 숙주 없이 네트워크로 스스로 복제해 퍼지는 웜, 정상 프로그램으로 위장하지만 자기 복제는 하지 않는 트로이 목마, 파일을 암호화하고 몸값을 요구하는 랜섬웨어를 구별해 두세요.
병원 진료 시스템에 '의사', '간호사', '원무과' 역할을 만들고, 의사에게는 진료 기록 작성, 간호사에게는 진료 기록 열람과 투약 기록 작성, 원무과에게는 수납 정보만 볼 수 있는 권한을 묶었습니다. 간호사가 원무과로 옮기면 그 사람의 역할만 바꾸면 되고, 사람마다 권한을 하나씩 손볼 필요가 없습니다(RBAC).
회원제 쇼핑몰을 설계하면서 로그인은 5회 실패하면 10분간 잠그고, 관리자 화면은 사내 IP와 2단계 인증을 함께 요구하며, 30분 동안 아무 동작이 없으면 세션을 끊기로 정했습니다. 오류가 나면 사용자에게는 '잠시 후 다시 시도해 주세요'만 보여 주고 자세한 내용은 서버 로그에만 남기도록 했습니다. 보안기능, 세션통제, 에러처리를 설계 단계에서 미리 정한 예입니다.
사내 메신저가 대화 내용 자체는 빠른 대칭키 암호(AES)로 암호화하고, 그 대칭키를 상대에게 건넬 때만 상대의 공개키(RSA)로 감싸서 보냈습니다. 대칭키의 속도와 비대칭키의 편리한 키 전달을 함께 얻는 방식입니다. 메시지마다 해시값을 붙여 전송 중에 내용이 바뀌지 않았는지도 확인했습니다.