# 신뢰는 설계된다: IT 보안의 구조적 사유

보안을 '완벽한 방어'로 이해하는 순간, 우리는 이미 본질을 놓친다. 완벽함이란 존재하지 않는 상태이며, 보안의 실체는 위험의 지속적 관리에 있다. 많은 조직과 개발자가 보안을 일회적 조치의 집합으로 취급한다. 방화벽을 설치하고, 암호화를 적용하고, 인증 체계를 구축하면 '보안이 완료되었다'고 착각한다.
이는 근본적 오해다. 보안은 완료되는 것이 아니라 설계되고 운영되는 체계다. 단일 기술의 도입이 아니라, 위협과 자산과 통제의 관계를 구조적으로 이해하는 것에서 시작한다. 방어는 점이 아닌 면으로, 순간이 아닌 지속으로 존재해야 한다.

## 위협 모델: 무엇을 어떻게 지킬 것인가
보안 설계는 위협 모델(Threat Model) 수립에서 출발한다. 무엇을 지켜야 하는지, 누가 공격할 것인지, 어떤 경로로 침투할 것인지를 명확히 정의하지 않으면, 모든 방어는 맹목적 투자에 불과하다.
위협 모델링의 핵심은 세 가지 질문으로 압축된다. 첫째, 자산(Asset)은 무엇인가? 보호해야 할 대상은 데이터일 수도, 서비스 가용성일 수도, 평판일 수도 있다. 모든 것을 동등하게 보호할 수는 없기에 우선순위가 필요하다. 둘째, 위협 주체(Threat Actor)는 누구인가? 무작위 공격자인가, 내부자인가, 국가 수준의 조직인가에 따라 방어 전략은 완전히 달라진다. 셋째, 공격 벡터(Attack Vector)는 무엇인가? 네트워크 침투인가, 소셜 엔지니어링인가, 공급망 공격인가를 식별해야 한다.

STRIDE 모델은 이러한 사고를 체계화한다. Spoofing(신원 위조), Tampering(데이터 변조), Repudiation(부인), Information Disclosure(정보 유출), Denial of Service(서비스 거부), Elevation of Privilege(권한 상승)라는 여섯 범주로 위협을 분류하고, 각각에 대응하는 통제를 설계한다. 이는 단순한 체크리스트가 아니라, 시스템의 각 구성요소가 어떤 위협에 노출되어 있는지를 구조적으로 사유하는 틀이다.
## 다층 방어: 하나의 벽이 아닌 여러 겹의 그물
단일 방어선은 언제나 돌파된다. 보안의 탁월함은 하나의 강력한 장벽이 아니라, 다층 방어(Defense in Depth)라는 구조적 설계에 있다.
다층 방어의 원리는 단순하다. 공격자가 하나의 방어 계층을 돌파하더라도, 다음 계층이 그를 저지한다. 네트워크 경계에서 방화벽이 첫 관문이라면, 애플리케이션 수준에서는 입력 검증과 인증이, 데이터 계층에서는 암호화와 접근 통제가 작동한다.

네트워크 계층에서는 방화벽, IDS/IPS, 세그먼테이션을 통해 불필요한 트래픽을 차단한다. Zero Trust 원칙에 따라 '내부 네트워크라도 신뢰하지 않는다'는 전제로 설계한다. 애플리케이션 계층에서는 입력 검증, 출력 인코딩, CSRF/XSS 방어가 필수다. OWASP Top 10은 여기서 가장 빈번한 취약점을 정리한 지침이다. 데이터 계층에서는 암호화(전송 중 TLS, 저장 시 AES)와 최소 권한 원칙을 적용한다.
이 구조의 핵심은 독립성과 상호보완성이다. 한 계층의 실패가 전체 붕괴로 이어지지 않도록, 각 방어 메커니즘은 서로 다른 원리와 기술로 구성되어야 한다. 네트워크 방화벽이 우회되더라도 애플리케이션의 인증 체계가 무단 접근을 막고, 인증이 뚫리더라도 데이터 암호화가 정보 유출의 영향을 제한한다.
## 인증과 권한: 누가 무엇을 할 수 있는가
시스템 보안의 핵심은 '누가 무엇을 할 수 있는가'를 명확히 정의하고 통제하는 것이다. 이는 인증(Authentication)과 인가(Authorization)라는 두 축으로 구현된다.

인증은 신원 확인이다. 패스워드, 생체 인식, 토큰 등 다양한 방법이 존재하지만, 단일 인증 수단은 취약하다. 패스워드는 유출되고, 생체 정보는 복제될 수 있다. 다중 인증(MFA)은 '알고 있는 것(지식)', '가지고 있는 것(소유)', '자신인 것(생체)'의 두 가지 이상을 결합하여 인증의 강도를 높인다. Google Authenticator나 YubiKey 같은 TOTP/FIDO2 기반 솔루션은 이제 표준에 가깝다.
인가는 권한 부여다. 인증된 사용자가 '무엇을 할 수 있는지' 결정한다. 여기서 핵심은 최소 권한 원칙이다. 사용자에게는 업무 수행에 필요한 최소한의 권한만 부여하고, 기본값은 '거부'로 설정한다. 역할 기반 접근 통제(RBAC)는 사용자를 역할로 그룹화하고, 역할에 권한을 할당하여 관리 복잡도를 줄인다.
속성 기반 접근 통제(ABAC)는 시간, 위치, 디바이스 등 다양한 컨텍스트를 권한 결정에 반영한다. 예컨대 사내 네트워크에서는 전체 접근을 허용하지만, 외부에서는 VPN과 MFA를 요구하는 식이다.
세션 관리 또한 중요하다. JWT를 사용한다면 토큰의 만료 시간을 짧게 설정하고, Refresh Token을 별도로 관리해야 한다. 세션 고정 공격을 막기 위해 로그인 시 세션 ID를 재생성하고, 로그아웃 시 서버 측에서 세션을 완전히 무효화해야 한다.
## 암호화: 데이터 자체를 지키는 마지막 방어선
데이터가 유출되는 순간, 기술적 방어의 모든 노력은 무의미해진다. 암호화는 데이터 자체를 보호하는 마지막 방어선이다.
암호화는 두 상태에서 적용된다. 전송 중 암호화(Encryption in Transit)는 데이터가 네트워크를 통해 이동할 때 적용된다. TLS 1.3는 현재 표준이며, HTTP는 이제 HTTPS로 대체되어야 한다. TLS는 단순히 데이터를 암호화하는 것을 넘어, 서버 인증과 무결성 검증까지 제공한다.
저장 시 암호화(Encryption at Rest)는 데이터베이스, 파일 시스템, 백업 등 저장된 데이터를 보호한다. AES-256은 대칭키 암호화의 사실상 표준이며, 키 관리가 핵심이다. 암호화 키를 코드에 하드코딩하거나 설정 파일에 평문으로 저장하는 것은 암호화를 무의미하게 만든다. AWS KMS, Azure Key Vault, HashiCorp Vault 같은 키 관리 서비스를 활용하여 키의 생성, 저장, 순환, 폐기를 체계적으로 관리해야 한다.
비밀번호 저장에는 해싱을 적용한다. MD5나 SHA-1은 이미 취약하다. bcrypt, scrypt, Argon2 같은 느린 해시 함수를 사용하여 무차별 대입 공격을 어렵게 만든다. 솔트(Salt)를 추가하여 레인보우 테이블 공격을 무력화하고, 반복 횟수를 조정하여 연산 비용을 높인다.
암호화는 만능이 아니다. 잘못 구현된 암호화는 거짓 안심을 준다. ECB 모드로 암호화하면 패턴이 노출되고, IV를 재사용하면 취약점이 생긴다. 암호화 라이브러리는 검증된 것을 사용하고, 자체 구현은 피해야 한다.
## 로깅과 모니터링: 보이지 않으면 방어할 수 없다
보안 사고의 평균 탐지 시간은 수개월에 달한다. 공격자는 이미 시스템 내부에 있지만, 조직은 그 사실조차 모른다. 이는 가시성(Visibility)의 부재에서 비롯된다.
로깅은 시스템의 모든 중요한 행위를 기록하는 것이다. 인증 시도, 권한 변경, 데이터 접근, 설정 수정, 오류 발생 등 보안과 관련된 이벤트는 모두 로그로 남겨야 한다. 로그는 단순한 기록이 아니라 분석 가능한 형태로 구조화되어야 한다. JSON 형식으로 로그를 출력하고, 타임스탬프, 사용자 ID, IP 주소, 행위 유형 등 필수 정보를 포함시킨다.
로그는 중앙 집중화되어야 한다. ELK Stack이나 Splunk 같은 로그 관리 시스템을 활용하여 분산된 서버와 애플리케이션의 로그를 한곳에 모은다. 이는 단순한 편의성을 넘어, 상관 분석을 가능하게 한다. 하나의 서버에서는 무해해 보이는 이벤트가, 다른 서버의 이벤트와 결합되면 공격 패턴으로 드러날 수 있다.
모니터링은 로그를 실시간으로 분석하여 이상 징후를 탐지하는 것이다. 머신러닝 기반 이상 탐지를 적용하면 정상 행위 패턴에서 벗어난 활동을 자동으로 식별할 수 있다. 평소 업무 시간에만 접속하던 사용자가 새벽 3시에 대량의 데이터를 다운로드한다면, 이는 조사가 필요한 신호다.
SIEM(Security Information and Event Management) 시스템은 로깅과 모니터링을 통합한다. 다양한 소스에서 로그를 수집하고, 상관 규칙을 적용하여 보안 이벤트를 탐지하며, 대시보드를 통해 보안 상황을 가시화한다.
로그의 무결성도 중요하다. 공격자는 흔적을 지우기 위해 로그를 조작한다. 로그 파일은 쓰기 전용으로 설정하고, 외부 저장소에 실시간으로 전송하며, 변조 방지를 위해 체크섬이나 디지털 서명을 적용한다.
## 취약점 관리: 발견하고 수정하는 속도
소프트웨어는 완벽하지 않다. 코드는 버그를 내포하며, 그 중 일부는 보안 취약점이 된다. 문제는 취약점의 존재가 아니라, 그것을 얼마나 빨리 발견하고 수정하는가에 있다.
의존성 관리는 취약점 관리의 첫 단계다. 현대 애플리케이션은 수백 개의 외부 라이브러리에 의존한다. 그 중 하나에 취약점이 있다면 전체 시스템이 위험해진다. npm audit, pip-audit, OWASP Dependency-Check 같은 도구는 의존성을 스캔하여 알려진 취약점(CVE)을 식별한다. 중요한 것은 도구를 실행하는 것만이 아니라, 발견된 취약점을 우선순위화하고 신속히 패치하는 것이다.
정적 분석(SAST)은 소스 코드를 실행하지 않고 분석하여 취약점을 찾는다. SQL Injection, XSS, 하드코딩된 비밀번호 같은 일반적 취약점을 조기에 발견할 수 있다. SonarQube, Checkmarx, Semgrep 등이 대표적이다. 다만 정적 분석은 오탐이 많고, 런타임에만 나타나는 취약점은 찾지 못한다.
동적 분석(DAST)은 실행 중인 애플리케이션을 공격하여 취약점을 찾는다. OWASP ZAP, Burp Suite 같은 도구가 웹 애플리케이션에 다양한 공격 패턴을 시도하며, 실제로 악용 가능한 취약점을 식별한다.
침투 테스트는 실제 공격자의 관점에서 시스템을 평가한다. 자동화 도구가 놓치는 논리적 취약점, 비즈니스 로직 결함, 복합적 공격 경로를 찾아낸다. 내부 팀이 수행할 수도 있고, 외부 전문가를 고용할 수도 있다.
버그 바운티 프로그램은 외부 보안 연구자의 힘을 빌린다. HackerOne, Bugcrowd 같은 플랫폼을 통해 취약점 신고에 보상을 제공하면, 수많은 전문가가 시스템을 테스트한다. 이는 비용 효율적이며, 다양한 관점을 확보할 수 있다.
취약점은 발견되는 것이 아니라 관리되는 것이다. 발견, 평가, 우선순위화, 수정, 검증이라는 사이클을 지속적으로 반복해야 한다.
## 인간: 가장 취약한 계층
기술은 완벽에 가까워질 수 있지만, 인간은 언제나 취약하다. 피싱, 소셜 엔지니어링, 내부자 위협은 기술적 방어를 우회하는 가장 효과적인 공격 벡터다.
보안 교육은 정기적이고 실질적이어야 한다. 단순히 정책 문서를 읽게 하는 것이 아니라, 실제 공격 사례를 보여주고, 모의 피싱 훈련을 실시하며, 안전한 행동을 습관화한다. 직원들은 의심스러운 이메일을 식별하는 법, 강력한 비밀번호를 만드는 법, 공용 Wi-Fi의 위험성을 이해해야 한다.
보안 문화는 조직 전체에 스며들어야 한다. 보안은 보안팀만의 책임이 아니라, 모든 구성원의 책임이다. 취약점을 발견했을 때 신고하는 것이 처벌이 아니라 보상으로 이어지는 문화, 보안 사고를 숨기는 것이 아니라 공유하고 배우는 문화가 필요하다.
내부자 위협은 특히 어렵다. 정당한 권한을 가진 사용자가 악의적으로 행동하면, 기술적 방어는 무력해진다. 이에 대한 답은 최소 권한 원칙의 철저한 적용과, 행위 분석(UBA)이다. 정상적인 사용 패턴을 학습하고, 이상 행위를 탐지하여 조사한다. 또한 중요한 작업에는 이중 승인을 요구하여, 단일 개인의 독단을 방지한다.
## 사고 대응: 실패를 전제한 설계
완벽한 방어는 환상이다. 언젠가 보안 사고는 발생한다. 중요한 것은 사고의 발생 여부가 아니라, 얼마나 빨리 탐지하고 대응하는가다.
사고 대응 계획은 사전에 수립되어야 한다. 누가 무엇을 언제 어떻게 할 것인지, 의사결정 구조와 커뮤니케이션 채널이 명확해야 한다. NIST의 사고 대응 프레임워크는 준비, 탐지 및 분석, 억제·근절·복구, 사후 활동의 4단계를 제시한다.
준비 단계에서는 대응 팀을 구성하고, 도구와 절차를 마련하며, 훈련을 실시한다. 탐지 및 분석에서는 로그와 모니터링 시스템을 통해 사고를 식별하고, 범위와 영향을 평가한다. 억제에서는 피해 확산을 막고, 근절에서는 공격자의 접근을 완전히 차단하며, 복구에서는 정상 운영을 재개한다. 사후 활동에서는 사고를 분석하고, 교훈을 도출하며, 재발 방지 대책을 수립한다.
백업과 재해 복구는 사고 대응의 핵심이다. 랜섬웨어 공격으로 데이터가 암호화되었을 때, 유일한 해결책은 백업에서 복원하는 것이다. 백업은 정기적으로 수행되고, 자동화되며, 오프라인 또는 불변 스토리지에 저장되어야 한다. 그리고 복원 절차는 정기적으로 테스트되어야 한다. 백업이 있어도 복원할 수 없다면 무의미하다.
포렌식은 사고의 원인과 경로를 분석한다. 로그, 메모리 덤프, 네트워크 패킷을 분석하여 공격자의 행동을 재구성하고, 증거를 수집한다. 이는 법적 대응의 기반이 되며, 동시에 재발 방지의 근거가 된다.
## 보안은 과정이다
보안은 제품이 아니라 과정이다. 한 번 구축하고 끝나는 것이 아니라, 지속적으로 평가하고 개선해야 하는 체계다. 위협은 진화하고, 시스템은 변화하며, 인간은 실수한다. 이러한 현실 속에서 보안의 본질은 위험의 지속적 관리에 있다.
신뢰는 우연히 얻어지지 않는다. 그것은 위협 모델의 정확한 이해, 다층 방어의 구조적 설계, 인증과 암호화의 원칙적 적용, 가시성의 확보, 취약점의 지속적 관리, 인간에 대한 교육, 그리고 사고 대응의 준비를 통해 설계된다.
기술은 도구를 제공하지만, 보안은 사유를 요구한다. 단편적 대응이 아닌 체계적 설계, 일회적 조치가 아닌 지속적 운영, 맹목적 신뢰가 아닌 검증된 원칙이 필요하다. 이것이 IT 보안의 본질이며, 신뢰 구축의 유일한 경로다.
1
조회수
0
좋아요