테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

보안의 기초

무엇을 누구에게서 지키는지 정하고, 한 겹이 뚫려도 버티게 설계하는 원칙이다.

목차 (7)
  1. 무엇을 지키나: CIA와 덧붙는 속성
  2. 위협 모델링: 네 가지 질문과 STRIDE
  3. 최소 권한
  4. 심층 방어
  5. 공격 표면
  6. 보안과 사용성
  7. 케르크호프스 원칙: 설계는 공개, 키만 비밀

무엇을 지키나: CIA와 덧붙는 속성

"안전하다"는 말은 무엇이 지켜졌는지 말하지 않으면 뜻이 없다. 보안에서 지키려는 성질은 흔히 세 가지로 나눈다. 머리글자를 따 CIA라 부른다. 미국 연방 정보 시스템의 분류 기준인 FIPS 199도 이 셋을 기준으로, 각각이 깨졌을 때 피해가 얼마나 큰지로 시스템의 등급을 매긴다.

속성뜻깨지는 예주로 지키는 수단
기밀성(confidentiality)허락된 사람만 읽는다고객 명단 유출, 공용 와이파이에서 엿보기암호화, 접근 통제
무결성(integrity)허락 없이 바뀌지 않았다송금 금액 변조, 내려받은 파일에 악성 코드 끼워 넣기해시·MAC·서명, 쓰기 권한 제한
가용성(availability)필요할 때 쓸 수 있다서비스 거부 공격, 랜섬웨어로 잠긴 파일여분 설비, 백업, 트래픽 흡수

여기에 둘을 더 붙이는 경우가 많다. 진본성(authenticity)은 메시지나 상대가 주장하는 그 출처가 맞다는 성질이고, 부인 방지(non-repudiation)는 어떤 일을 한 사람이 나중에 하지 않았다고 잡아뗄 수 없다는 성질이다. NIST 용어집은 부인 방지를 보낸 이와 받은 이 모두가 처리 사실을 증명받는 것으로 설명한다. 둘 다 주로 디지털 서명과 변조할 수 없는 기록으로 지킨다.

세 축은 서로 당긴다. 백업을 여러 곳에 두면 가용성은 오르지만 복사본마다 기밀성을 지켜야 할 곳이 늘고, 모든 요청을 깐깐하게 검사하면 무결성은 오르지만 느려져 가용성이 떨어질 수 있다. 그래서 "무엇을 얼마나 지킬지"를 먼저 정하는 일이 뒤의 모든 설계를 이끈다.

CIA 삼각형: 기밀성, 무결성, 가용성이 세 꼭짓점에 있고, 오른쪽에 흔히 덧붙이는 진본성과 부인 방지가 있다지킬 것기밀성 Confidentiality허락된 사람만 읽는다무결성 Integrity몰래 바뀌지 않았다가용성 Availability필요할 때 쓸 수 있다흔히 덧붙이는 속성진본성authenticity보낸 이가 그 사람이 맞다부인 방지non-repudiation한 일을 나중에 잡아떼지 못한다CIA 세 축흔히 덧붙이는 속성 (주로 서명·로그로 지킨다)
CIA 삼각형. 기밀성·무결성·가용성이 보안의 세 축이고, 진본성과 부인 방지는 서명과 기록으로 지키는 덧붙는 속성이다.

위협 모델링: 네 가지 질문과 STRIDE

위협 모델링(threat modeling)은 시스템을 만들기 전이나 고치기 전에, 무엇이 잘못될 수 있는지를 체계적으로 따져 보는 일이다. 업계 실무자들이 함께 쓴 Threat Modeling Manifesto는 이 일을 네 가지 질문으로 줄인다.

  1. 무엇을 만들고 있나? (구성 요소, 데이터 흐름, 신뢰 경계를 그린다)
  2. 무엇이 잘못될 수 있나? (위협을 찾는다)
  3. 그래서 무엇을 할 것인가? (대응을 정하거나, 위험을 받아들이기로 결정한다)
  4. 충분히 잘했나? (빠진 것이 없는지 점검한다)

첫 질문에 답하려면 지킬 자산(asset)과 맞설 공격자를 정해야 한다. 자산은 고객 정보, 돈, 평판, 서비스가 멈추지 않는 시간처럼 잃으면 아픈 것이다. 공격자는 누가, 무엇을 가지고, 왜 노리는지로 그린다. 호기심 많은 사용자, 자동화된 봇, 내부 직원, 국가 수준의 조직은 가진 시간과 도구가 다르고, 모두를 똑같이 막으려 하면 아무도 제대로 막지 못한다. OWASP 위협 모델링 치트 시트와 OWASP 위협 모델링 절차가 이 과정을 단계별로 정리해 둔다.

두 번째 질문에서 빠뜨림을 줄이려고 쓰는 체크리스트가 Microsoft가 만든 STRIDE다. 여섯 머리글자는 각각 앞에서 본 보안 속성 하나를 깨뜨리는 위협이다. 그림의 요소(사용자, 서버, 저장소, 흐름)마다 여섯 질문을 하나씩 던지면 된다. 분류는 Microsoft Threat Modeling Tool 문서를 따랐다.

위협뜻깨지는 속성대응의 예
S 사칭(Spoofing)남인 척한다진본성(인증)다중 인증, 서명
T 변조(Tampering)데이터나 코드를 몰래 바꾼다무결성TLS, MAC, 쓰기 권한 제한
R 부인(Repudiation)한 일을 안 했다고 한다부인 방지변조 불가능한 감사 로그, 서명
I 정보 노출(Information disclosure)보면 안 되는 것을 본다기밀성암호화, 접근 통제, 오류 메시지 줄이기
D 서비스 거부(Denial of service)쓰지 못하게 만든다가용성속도 제한, 여분 설비
E 권한 상승(Elevation of privilege)허락보다 많은 일을 한다인가최소 권한, 입력 검증, 샌드박스
위협 모델링 단계 그림: 사용자, 웹 서버, DB를 잇는 흐름 위에 신뢰 경계를 긋고, 요소마다 STRIDE 위협과 대응을 적는다신뢰 경계신뢰 경계사용자외부 개체웹 서버처리DB데이터 저장소요청쿼리S 사칭다중 인증T 변조 · R 부인D 거부 · E 권한 상승TLS · 감사 로그속도 제한 · 최소 권한I 정보 노출암호화 · 접근 통제위협마다 대응이 있나? 설계가 바뀌면 다시 그린다질문 1. 무엇을 만들고 있나? — 구성 요소와 데이터 흐름질문 1. 무엇을 만들고 있나? — 신뢰 경계 긋기질문 2. 무엇이 잘못될 수 있나? — STRIDE로 묻기질문 3. 그래서 무엇을 할 것인가? — 대응 붙이기질문 4. 충분히 잘했나? — 빠진 위협 점검신뢰 경계위협(STRIDE 머리글자)대응
1 / 5

먼저 무엇을 만드는지 그린다. 사용자가 웹 서버에 로그인 요청을 보내고, 서버는 DB에 묻는다.

위협 모델링의 네 질문을 로그인 서비스 하나에 적용한 예. 시스템을 그리고, 경계를 긋고, STRIDE로 위협을 묻고, 대응을 붙인 뒤 점검한다. 위협과 대응은 예시로 고른 일부다.

위협 모델은 완벽할 필요가 없다. 화이트보드에 상자 세 개를 그리고 30분 이야기하는 것만으로도 "관리자 페이지가 인터넷에 열려 있었다" 같은 큰 구멍이 먼저 보인다. 중요한 것은 설계가 바뀔 때마다 다시 보는 습관이다.

찾은 위협을 모두 같은 힘으로 막을 수는 없으므로 순서를 정한다. 이때 쓰는 말이 위험(risk)이다. NIST 용어집은 위험을 일이 벌어졌을 때의 피해 크기와 그 일이 벌어질 가능성의 함수로 정의한다. 가능성은 낮아도 피해가 치명적인 것과, 피해는 작아도 매일 일어나는 것을 같은 표 위에 놓고 비교하게 해 준다. 위험 평가 절차는 NIST SP 800-30 Rev. 1이 정리한다.

위험을 다루는 길은 대개 넷으로 나눈다. 통제를 더해 줄이고(완화), 그 기능을 아예 없애 피하고(회피), 보험이나 계약으로 남과 나누고(공유·전가), 비용이 이득보다 크면 알고서 받아들인다(수용). 흔한 오해는 위험을 0으로 만들 수 있다는 생각이다. 남는 위험은 늘 있고, 그것을 누가 받아들였는지 적어 두는 것까지가 위험 관리다.

최소 권한

최소 권한(least privilege)은 사람이든 프로그램이든 맡은 일에 꼭 필요한 권한만, 필요한 동안만 갖게 하라는 원칙이다. 1975년 Saltzer와 Schroeder의 논문 The Protection of Information in Computer Systems가 정리한 설계 원칙 여덟 가지 중 하나이고, 지금도 NIST 용어집에 같은 뜻으로 실려 있다.

원리는 피해 반경(blast radius)이다. 어떤 계정이든 언젠가 탈취될 수 있다고 가정하면, 그 계정이 닿는 범위가 곧 사고의 크기가 된다. 웹 앱이 DB 관리자 계정으로 접속하면 작은 버그 하나가 모든 표를 지우는 사고로 번지지만, 읽기만 하는 계정으로 접속했다면 같은 버그로도 지울 수는 없다.

  • DB 계정을 용도별로 나누고, 조회 화면은 읽기 권한만 준다.
  • 컨테이너와 서비스는 관리자(root)가 아닌 전용 사용자로 돌린다.
  • API 토큰은 범위(scope)와 유효 기간을 좁게 발급한다. 인증과 인가 노트의 OAuth 절이 이 방식이다.
  • 사람의 관리자 권한은 평소 계정과 분리하고, 필요할 때만 잠깐 올려 쓰며 그 사실을 기록한다.

최소 권한과 짝을 이루는 원칙이 직무 분리(separation of duties)다. 누구도 혼자서 시스템을 악용할 만큼의 권한을 갖지 않게, 위험한 일을 두 사람 이상에게 나눈다. 급여를 만드는 사람과 승인하는 사람을 나누고, 코드를 쓴 사람이 혼자 운영 서버에 배포하지 못하게 검토를 거치게 하는 식이다. 내부자의 잘못이나 한 계정의 탈취가 곧장 사고로 이어지지 않게 하는 장치다.

왼쪽은 앱 계정 하나가 회원 DB, 결제, 백업에 모두 닿아 탈취되면 셋 다 위험하고, 오른쪽은 일마다 계정을 나눠 탈취된 결제 계정은 결제에만 닿는다한 계정이 모든 권한앱 계정탈취됨회원 DB결제백업탈취되면 셋 다 위험일마다 필요한 권한만조회 계정회원 읽기만회원 DB결제 계정탈취됨결제백업 계정백업 쓰기만백업탈취돼도 결제만 위험탈취된 계정이 닿는 범위닿지 않는 권한
최소 권한과 피해 반경. 한 계정이 모든 권한을 가지면 탈취 한 번에 전부가 위험하지만, 일마다 계정을 나누면 탈취된 계정의 몫만 위험하다.

심층 방어

심층 방어(defense in depth)는 방어를 여러 겹으로 쌓아 한 겹이 뚫려도 다음 겹이 막게 하는 설계다. NIST 용어집은 이를 사람, 기술, 운영에 걸쳐 여러 방어선을 두는 전략으로 설명한다. 성의 해자와 성벽과 성문과 경비병이 모두 있는 것과 같다.

겹을 쌓는 이유는 어떤 방어도 완벽하지 않기 때문이다. 방화벽은 열어 둔 포트로 들어오는 공격을 모르고, 입력 검증은 개발자가 빠뜨린 한 곳에서 뚫리고, 비밀번호는 피싱으로 새어 나간다. 층마다 놓치는 것이 다르면 공격자는 모든 층의 약점을 한꺼번에 찾아야 한다.

다만 겹의 수보다 독립성이 중요하다. 다섯 층이 모두 같은 관리자 비밀번호로 잠겨 있다면 사실상 한 층이다. 또 막는 층만큼 알아채는 층(로그, 이상 탐지)과 되돌리는 층(백업, 사고 대응)이 필요하다. 막지 못한 공격을 빨리 알아채면 피해가 작아진다. 이 이야기는 사람과 운영 노트에서 이어진다.

공격 세 번이 경계, 네트워크, 애플리케이션, 인증, 데이터 다섯 층을 지나다 각각 다른 층에서 막힌다. 층마다 30퍼센트를 놓쳐도 다섯 층을 모두 빠져나갈 확률은 0.24퍼센트다경계방화벽네트워크분리·차단애플리케이션입력 검증인증다중 인증데이터암호화공격자✕✕✕층마다 10번 중 3번을 놓쳐도, 다섯 층을 모두 빠져나갈 확률은 0.3⁵ ≈ 0.24%층이 서로 독립일 때의 계산이다. 같은 약점을 나눠 가지면 훨씬 높아진다공격 시도✕그 층에서 막힘
심층 방어. 공격 세 번이 서로 다른 층에서 막힌다. 아래 계산은 층이 서로 독립이라고 가정한 값이고, 같은 약점을 나눠 가진 층은 이만큼 막아 주지 못한다.

공격 표면

공격 표면(attack surface)은 공격자가 시스템에 무언가를 넣거나 꺼낼 수 있는 모든 지점의 합이다. 로그인 화면, 공개 API, 파일 업로드, 열린 네트워크 포트, 관리자 페이지, 서드파티 라이브러리가 모두 여기에 들어간다. NIST 용어집의 정의도 같고, OWASP 공격 표면 분석 치트 시트는 입구를 목록으로 만들고 바뀔 때마다 다시 보라고 권한다.

입구가 하나 늘 때마다 지켜야 할 코드도 는다. 그래서 가장 싸고 확실한 방어는 입구를 없애는 것이다. 쓰지 않는 기능과 옛 API 버전은 끄고, 개발용 디버그 기능은 배포에서 빼고, 관리 기능은 인터넷이 아닌 사내망이나 VPN 뒤에 둔다. 남은 입구에는 인증과 입력 검증과 기록을 단다. 의존성도 입구다. 라이브러리 하나를 더할 때의 위험은 시스템·소프트웨어 보안 노트의 공급망 절에서 다룬다.

왼쪽 서비스는 로그인, API, 파일 업로드, 관리자 페이지, 디버그 포트, 옛 API 여섯 입구가 열려 있고, 오른쪽은 뒤의 셋을 없애거나 사내망으로 옮겨 세 입구만 남는다입구 여섯 개서비스로그인API파일 업로드관리자 페이지디버그 포트옛 API v1입구 세 개서비스로그인API파일 업로드관리자 페이지는사내망 안으로쓰지 않는 기능은 끄고, 남은 입구에는 인증·입력 검증·기록을 단다없애거나 숨길 수 있는 입구꼭 필요한 입구
공격 표면 줄이기. 쓰지 않거나 공개할 필요가 없는 입구(빨강)를 없애면 지켜야 할 곳 자체가 준다.

보안과 사용성

보안 장치는 사람이 쓴다. 너무 번거로우면 사람들은 우회한다. 비밀번호를 석 달마다 바꾸게 하면 "봄2025!"가 "여름2025!"로 바뀌고, 복잡한 비밀번호를 강요하면 모니터에 포스트잇이 붙는다. Saltzer와 Schroeder는 이것을 "심리적 수용성"(psychological acceptability)이라는 원칙으로 적었다. 보호 장치가 쓰기 쉬워야 사람들이 습관처럼 제대로 쓴다는 뜻이다.

실제 지침도 이 방향으로 바뀌었다. NIST의 디지털 신원 지침 SP 800-63B는 비밀번호를 주기적으로 강제로 바꾸게 하거나 문자 종류 조합을 강요하지 말라고 하고, 대신 길이를 넉넉히 허용하고 유출된 비밀번호 목록과 대조하라고 한다. 자세한 내용은 인증과 인가 노트에 있다.

좋은 해법은 보안과 편의를 저울질하는 대신 둘을 함께 올리는 설계다. 패스키는 비밀번호보다 편하면서 피싱에도 강하고, 처음부터 안전한 설정으로 출고하는 안전한 기본값(secure by default)은 사용자가 아무것도 하지 않아도 안전하게 만든다. 미국 CISA의 Secure by Design 캠페인은 이 부담을 사용자가 아니라 제품을 만드는 쪽이 져야 한다고 강조한다.

개념 곡선: 규칙이 엄격해질수록 실제 보안이 오르다가, 마찰이 지나치면 사람들이 메모나 공유 계정으로 우회해 다시 떨어진다. 좋은 설계의 곡선은 그보다 위에 있다실제로 얻는 보안느슨함규칙의 엄격함 · 사용자가 느끼는 마찰엄격함좋은 설계: 같은 마찰에 더 큰 보안여기서부터 우회가 늘어난다(메모한 비밀번호, 공유 계정)흔한 규칙(잦은 강제 변경, 복잡도 강제)좋은 설계(안전한 기본값, 패스키)
보안과 사용성의 개념도(실제 수치가 아니다). 흔한 규칙은 조일수록 어느 지점부터 우회가 늘어 실제 보안이 떨어진다. 좋은 설계는 같은 마찰에서 곡선 자체를 위로 올린다.

케르크호프스 원칙: 설계는 공개, 키만 비밀

1883년 네덜란드 출신 언어학자 Auguste Kerckhoffs는 논문 La cryptographie militaire에서 군용 암호가 갖춰야 할 조건을 적었다. 그중 둘째가 지금 케르크호프스 원칙(Kerckhoffs's principle)이라 불린다. 암호 체계는 비밀이어선 안 되고, 적의 손에 들어가도 문제가 없어야 한다는 것이다. 지켜야 할 비밀은 키 하나뿐이어야 한다. 정보 이론을 세운 Claude Shannon은 이를 "적은 시스템을 안다"는 말로 줄였다.

이유는 현실적이다. 설계는 소스 코드, 펌웨어, 퇴사한 직원, 역공학을 통해 결국 새어 나간다. 설계가 곧 비밀이면 한 번 새는 순간 그 설계를 쓰는 모두가 뚫리고, 바꾸려면 시스템 전체를 다시 만들어야 한다. 키만 비밀이면 새어 나간 키를 버리고 새 키를 쓰면 된다. 게다가 공개된 설계는 전 세계 연구자가 공격해 본 뒤에야 표준이 된다. AES와 SHA-3가 공개 공모전으로 뽑힌 이유다. 이 원칙의 현대적 결론이 "직접 만든 암호를 쓰지 말라"이고, 암호 노트에서 다시 다룬다.

숨기기가 쓸모없다는 뜻은 아니다. 관리자 페이지 주소를 알기 어렵게 두는 것은 자동 스캐너를 줄이는 한 겹이 될 수 있다. 다만 그것만 믿는 은폐에 의한 보안(security through obscurity)은 진짜 방어가 아니다. 숨기기와 암호화의 차이는 스테가노그래피 도구에서 직접 볼 수 있다. 숨긴 메시지는 있다는 것을 들키면 그대로 읽히지만, 암호화한 메시지는 들켜도 키 없이는 읽히지 않는다.

위 줄: 비밀 알고리즘의 설계가 유출되면 모든 사용자가 뚫리고 설계를 다시 만들어야 한다. 아래 줄: 공개 알고리즘에 비밀 키를 쓰면 키가 유출돼도 그 키만 바꾸면 된다설계를 숨기면비밀 알고리즘설계가 곧 비밀설계 유출모든 사용자가 한꺼번에 뚫린다설계를 다시 만들어 모두에게 배포해야 한다설계는 공개하고 키만 숨기면공개 알고리즘 + 비밀 키예: AES, 누구나 분석한다키 유출그 키만 폐기하고 새 키로 바꾼다알고리즘과 다른 사용자는 그대로다공개된 설계는 많은 사람이 검토해 약점이 먼저 드러나고, 고쳐진 뒤에야 널리 쓰인다피해가 모두에게피해가 키 하나에 그친다
케르크호프스 원칙. 설계를 숨기면 유출 한 번에 모두가 뚫리지만, 설계를 공개하고 키만 숨기면 새어 나간 키 하나만 바꾸면 된다.