보안의 기초
지금까지 컴퓨터가 어떻게 동작하는지를 배웠다. 이 장에서는 그 동작을 나쁜 의도로 이용하려는 사람으로부터 어떻게 지키는지 알아본다. 해커 영화처럼 화려한 이야기는 아니다. 대부분의 보안은 앞에서 배운 원리, 즉 숫자로 된 데이터, 메모리와 스택, 네트워크의 봉투, 운영체제의 권한을 정확히 이해하는 데서 출발한다.
- 보안의 세 목표(기밀성, 무결성, 가용성)로 위협을 분류한다.
- 해시가 데이터의 지문 역할을 하는 원리와 눈사태 효과를 체험한다.
- 비밀번호를 해시와 솔트로 저장하는 이유, 길이가 강도를 좌우하는 이유를 계산으로 확인한다.
- 고전 암호가 글자 빈도 분석으로 깨지는 모습을 보고, 현대 암호와의 차이를 안다.
- 버퍼 오버플로가 스택의 돌아갈 주소를 덮어쓰는 원리를 따라간다.
- 피싱과 2단계 인증 등 사람을 노리는 공격과 대응을 안다.
무엇을 지키는가: 보안의 세 기둥
보안 문제는 대부분 다음 세 가지 중 하나를 깨뜨리려는 시도다. 보안 분야에서는 앞 글자를 따서 CIA라고 부른다.
| 목표 | 뜻 | 깨지는 예 | 지키는 도구 |
|---|---|---|---|
| 기밀성 Confidentiality | 허락된 사람만 볼 수 있다 | 카페 Wi-Fi 도청, 해킹으로 고객 정보 유출 | 암호화(HTTPS, 11장), 접근 권한 |
| 무결성 Integrity | 몰래 바뀌지 않는다 | 송금 금액 위조, 다운로드한 앱에 악성 코드 삽입 | 해시, 전자 서명, 인증서 |
| 가용성 Availability | 필요할 때 쓸 수 있다 | 서버에 가짜 요청을 퍼부어 마비시키기, 랜섬웨어로 파일 잠그기 | 여분 서버, 백업, 트래픽 걸러내기 |
비밀 레시피가 새어 나가면 기밀성, 누군가 몰래 소금 통에 설탕을 바꿔 넣으면 무결성, 가짜 예약 전화가 빗발쳐 진짜 손님을 못 받으면 가용성의 문제다. 각각 지키는 방법이 다르다. 금고, 봉인 스티커, 예약 확인 절차.
해시: 데이터의 지문
해시 함수(hash function)는 아무리 긴 데이터를 넣어도 항상 같은 길이의 숫자(지문)를 내놓는 계산이다. 좋은 보안용 해시(예: SHA-256)는 세 가지 성질을 가진다.
- 같은 입력 → 항상 같은 지문. 그래서 파일이 바뀌지 않았는지 확인할 수 있다.
- 지문에서 원래 데이터를 거꾸로 알아낼 수 없다. 고기를 다져 만든 동그랑땡에서 원래 고기 모양을 되살릴 수 없는 것과 같다.
- 입력이 조금만 달라도 지문이 완전히 달라진다. 이것을 눈사태 효과라 한다.
SHA-256 지문과 눈사태 효과
비밀번호는 어떻게 저장해야 할까
웹사이트는 내 비밀번호를 기억해야 로그인을 확인할 수 있다. 하지만 비밀번호를 그대로 저장하면, 서버가 한 번 털리는 순간 모든 사용자의 비밀번호가 새어 나간다. 그래서 제대로 된 서비스는 비밀번호 대신 비밀번호의 해시를 저장한다. 로그인할 때 입력한 비밀번호를 같은 방식으로 해시해서 저장된 값과 비교한다. 서버도 내 비밀번호를 모른다.
해시는 거꾸로 풀 수 없으므로, 공격자에게 남은 방법은 가능한 비밀번호를 하나씩 해시해서 맞춰 보는 무차별 대입(brute force)뿐이다. 이때 시간을 좌우하는 것은 비밀번호의 경우의 수, 즉 (쓸 수 있는 글자 수)길이다. 2장의 비트처럼, 한 자리가 늘 때마다 곱절로 커진다.
내 비밀번호를 맞히는 데 얼마나 걸릴까
대소문자+숫자 8자리 비밀번호를 12자리로 늘리면, 빠른 해시를 쓰는 GPU 공격자가 맞히는 시간은 대략 어떻게 될까?
위 계산기에서 길이만 8 → 12로 바꿔 보자.
고전 암호는 왜 깨질까
로마의 율리우스 카이사르는 글자를 알파벳 순서로 몇 칸씩 밀어서 편지를 썼다고 한다. A → D, B → E처럼. 열쇠는 “몇 칸 밀었나” 하나뿐이다. 이 카이사르 암호는 열쇠가 26가지뿐이라 하나씩 다 해 봐도 되지만, 더 영리한 방법이 있다. 영어에서는 E가 가장 자주 나온다. 암호문에서 가장 많이 나온 글자가 E일 가능성이 높다.
카이사르 암호와 빈도 분석
버퍼 오버플로: 칸을 넘친 글자
13장에서 함수를 부르면 스택에 지역 변수와 돌아갈 주소가 나란히 쌓인다고 했다. 그런데 프로그램이 8글자짜리 칸(버퍼)을 만들어 놓고, 사용자가 입력한 글자를 길이 확인 없이 그대로 복사하면 어떻게 될까? 8글자를 넘는 부분이 옆 칸, 즉 돌아갈 주소를 덮어쓴다. 함수가 끝나면 CPU는 덮어쓴 엉뚱한 주소로 점프한다. 공격자가 그 주소를 자기가 심어 둔 코드 위치로 정교하게 맞추면 프로그램을 마음대로 조종할 수 있다. 이것이 수십 년간 가장 유명했던 공격, 버퍼 오버플로(buffer overflow)다.
스택 속 버퍼 넘치기
가장 약한 고리는 사람
암호가 아무리 튼튼해도 사람이 비밀번호를 직접 건네 버리면 소용없다. 은행이나 택배사를 사칭한 문자로 가짜 로그인 페이지에 유도하는 피싱(phishing)이 대표적이다. 가짜 페이지도 자물쇠(HTTPS)를 달 수 있다는 점을 기억하자(11장). 자물쇠는 “암호화되어 있다”는 뜻이지 “믿을 만한 곳”이라는 뜻이 아니다.
그래서 요즘은 비밀번호 하나에만 기대지 않는 2단계 인증(2FA)을 쓴다. “아는 것”(비밀번호)에 더해 “가진 것”(휴대폰, 보안 키)이나 “나 자신”(지문, 얼굴)을 함께 확인한다. 비밀번호가 새어도 휴대폰까지 훔치지 않는 한 로그인할 수 없다. 최근에는 아예 비밀번호 없이 기기 안의 개인 키로 서명해 로그인하는 패스키도 쓰인다. 사이트 주소까지 확인하므로 피싱에 속지 않는다.
| 지금 바로 할 수 있는 것 | 왜 효과가 있나 (관련 장) |
|---|---|
| 운영체제와 앱을 최신으로 업데이트 | 알려진 취약점(버퍼 오버플로 등)이 패치된다 (8·13장) |
| 사이트마다 다른 긴 비밀번호 + 비밀번호 관리자 | 한 곳이 털려도 다른 곳은 안전하다 (이 장) |
| 2단계 인증 또는 패스키 켜기 | 비밀번호가 새도 로그인할 수 없다 (이 장) |
| 문자·메일 속 링크 대신 주소를 직접 입력 | 피싱 페이지를 피한다 (11장) |
| 중요한 파일은 다른 곳에 백업 | 랜섬웨어·고장에도 가용성을 지킨다 (7장) |
핵심 정리
- 보안은 기밀성(아무나 못 봄), 무결성(몰래 안 바뀜), 가용성(필요할 때 쓸 수 있음)을 지키는 일이다.
- 해시는 데이터의 지문이다. 거꾸로 풀 수 없고, 입력이 조금만 달라도 지문이 크게 달라진다(눈사태 효과).
- 비밀번호는 솔트를 섞은 느린 해시로 저장한다. 강도는 글자 종류보다 길이가 지수적으로 좌우한다.
- 고전 암호는 빈도 분석으로 깨진다. 현대 암호는 흔적을 남기지 않고 열쇠의 경우의 수가 천문학적이다.
- 버퍼 오버플로는 길이 검사 없는 복사가 스택의 돌아갈 주소를 덮어쓰는 공격이다. 카나리, ASLR, 실행 금지, 안전한 언어로 막는다.
- 사람을 노리는 피싱에는 2단계 인증과 패스키가 효과적이다.
확인 퀴즈
랜섬웨어가 회사의 파일을 모두 잠가 업무를 못 하게 만들었다. 가장 직접적으로 깨진 보안 목표는?
보안용 해시 함수의 성질이 아닌 것은?
비밀번호를 해시할 때 사용자마다 다른 ‘솔트’를 섞는 이유는?
버퍼 오버플로 공격이 덮어쓰려는 가장 중요한 값은?
피싱 사이트의 주소창에도 자물쇠 아이콘이 보였다. 올바른 해석은?