통신 보안 편에서 암호화와 방화벽으로 '내용'과 '통로'를 지키는 방법을 보았습니다. 그런데 서버 입장에서 가장 먼저 풀어야 할 질문은 "지금 접속한 사람이 정말 그 사람인가?"입니다. 이 장에서는 그 질문에 답하는 사용자 인증(비밀번호, 일회용 비밀번호 OTP, 패스키)과, 밖에서도 기관 내부망에 안전하게 들어가게 해 주는 VPN의 동작 원리를 직접 계산해 보며 알아봅니다. 이 장의 OTP는 일회용 비밀번호(One-Time Password)로, 통신 보안 편의 일회용 패드(One-Time Pad)와는 다른 말입니다. 처음 보는 약자는 아래 📖 용어 및 약자 설명에서 찾아보세요.
인증(authentication)은 "누구인가"를 확인하는 일이고, 인가(authorization)는 확인된 사람이 "무엇을 할 수 있는가"를 정하는 일입니다. 예를 들어 로그인은 인증이고, 로그인한 학생이 성적 관리 화면에 들어갈 수 없게 막는 것은 인가입니다. 사람을 확인하는 단서(인증 요소)는 크게 세 가지입니다.
| 인증 요소 | 예 | 강점 | 약점 |
|---|---|---|---|
| 🧠 아는 것 (지식) | 비밀번호, PIN, 보안 질문 | 어디서나 쓸 수 있고 비용이 들지 않음 | 엿보기·유출·추측·재사용에 약함 |
| 📱 가진 것 (소유) | OTP 앱·OTP 기기, 보안키, 스마트폰, 인증서가 든 기기 | 원격에서 훔치기 어려움 | 잃어버리거나 고장 날 수 있음 |
| 👆 나 자신 (생체) | 지문, 얼굴, 홍채 | 잊어버리지 않음, 빠름 | 바꿀 수 없음(유출되면 평생 영향) — 그래서 보통 기기 안에서만 확인 |
서로 다른 종류의 요소를 두 가지 이상 함께 쓰는 것을 다중 인증(MFA), 두 가지면 2단계 인증(2FA)이라고 합니다. 비밀번호와 OTP는 '아는 것 + 가진 것'이라 다중 인증이지만, 비밀번호를 두 번 묻는 것은 같은 종류라서 다중 인증이 아닙니다. 비밀번호가 유출되어도 공격자에게는 내 OTP 기기가 없으므로 로그인할 수 없습니다.
잘 만든 서버는 비밀번호를 원문 그대로 저장하지 않습니다. 회원 가입 때 사용자마다 다른 무작위 값(솔트)을 만들어 비밀번호와 섞은 뒤, 일부러 아주 여러 번 반복하는 해시 함수로 지문을 만들어 저장합니다. 로그인할 때는 입력한 비밀번호로 같은 계산을 다시 해서 저장된 지문과 같은지만 비교합니다. 이렇게 하면 저장소가 통째로 유출되어도 원래 비밀번호를 알아내기가 매우 어렵습니다.
👉 같은 비밀번호로 두 사람을 가입시켜 보고, 반복 횟수를 바꿔 해시 한 번에 걸리는 시간을 재 보세요!
계산은 브라우저에 들어 있는 진짜 PBKDF2-HMAC-SHA256으로 하며, 입력한 비밀번호는 이 화면 밖으로 나가지 않습니다. 걸린 시간은 이 컴퓨터의 성능에 따라 다릅니다.
🧮 실제 값으로 계산해 보기 — 반복 해시가 공격자를 얼마나 늦출까?
OTP(One-Time Password)는 한 번만 쓸 수 있는 비밀번호입니다. 가장 널리 쓰는 TOTP(시간 기반 OTP) 앱은 처음 등록할 때 서버와 스마트폰이 QR 코드로 비밀 키를 하나 나눠 갖습니다. 그 뒤로는 통신 없이도 양쪽이 각자 지금 시각과 비밀 키로 같은 계산을 해서 같은 6자리 숫자를 만듭니다. 숫자는 30초마다 바뀌므로, 누가 엿보거나 훔쳐도 금방 쓸모가 없어집니다.
| OTP 종류 | 숫자를 바꾸는 기준 | 특징 |
|---|---|---|
| TOTP (RFC 6238) | 현재 시각 ÷ 30초 (시간 칸 번호) | 인증 앱(스마트폰), OTP 카드. 가장 흔함 |
| HOTP (RFC 4226) | 버튼을 누를 때마다 1씩 느는 횟수(카운터) | 시계가 필요 없지만, 기기와 서버의 횟수가 어긋날 수 있음 |
| 문자·이메일 OTP | 서버가 무작위 숫자를 만들어 보내 줌 | 쓰기 쉽지만 문자 가로채기·유심 복제에 약해 점점 덜 권장됨 |
| 푸시 승인 | 앱에 "로그인하시겠습니까?" 알림 | 편리하지만 무심코 '승인'을 누르게 하는 공격(알림 폭탄)에 주의 |
TOTP 앱 안에서는 다음 계산이 30초마다 일어납니다.
👉 스마트폰과 서버가 각자 같은 코드를 만드는 모습을 보고, 코드를 입력해 로그인해 보세요. 스마트폰 시계를 어긋나게 하거나 같은 코드를 두 번 넣어 보세요!
📱 스마트폰 인증 앱
🖥️ 서버 (같은 비밀 키로 직접 계산)
코드는 브라우저의 진짜 HMAC-SHA1로 계산합니다. 서버는 시계 차이를 감안해 앞뒤 한 칸(±30초)까지 받아 주고, 이미 쓴 코드는 다시 받지 않으며, 5번 틀리면 잠깁니다.
🧮 실제 값으로 계산해 보기 — 6자리 OTP를 찍어서 맞힐 확률
비밀번호와 OTP는 결국 '비밀 값을 서버에 보내는' 방식이라, 가짜 사이트에 입력하면 빼앗깁니다. 공개키 인증은 비밀을 아예 보내지 않습니다. 기기 안에서 개인키·공개키 한 쌍을 만들어 공개키만 서버에 등록해 두고, 로그인할 때마다 서버가 보낸 무작위 문제(챌린지)에 개인키로 서명해 돌려줍니다. 서버는 공개키로 서명을 확인합니다. SSH 키 로그인, 인증서 로그인, 그리고 요즘 웹의 패스키(FIDO2/WebAuthn)가 모두 이 원리입니다. 패스키는 서명할 때 지금 접속한 사이트 주소(오리진)를 함께 서명하므로, 이름이 비슷한 가짜 사이트에서 받은 서명은 진짜 서버에서 쓸 수 없습니다.
👉 ①~④ 단계를 차례로 눌러 보고, 가짜 사이트와 챌린지 재사용으로 공격해 보세요!
브라우저의 진짜 ECDSA(P-256) 서명으로 계산합니다. 실제 패스키는 운영체제·보안키가 개인키를 안전한 칩 안에 보관하고, 오리진과 챌린지를 담은 정해진 형식에 서명합니다. 여기서는 그 핵심만 흉내 냈습니다.
VPN(Virtual Private Network, 가상 사설망)은 공용 인터넷 위에 암호화된 터널을 만들어, 멀리 있는 컴퓨터를 기관 내부망에 직접 꽂은 것처럼 쓰게 해 줍니다. 원리는 캡슐화입니다. 내부망으로 가는 원래 패킷 전체를 암호화한 뒤, VPN 게이트웨이로 가는 새 패킷 안에 통째로 담아 보냅니다. 게이트웨이는 바깥 포장을 벗기고 복호화해 원래 패킷을 내부망에 내보냅니다. 길 위에서 엿보는 사람에게는 "누군가 VPN 게이트웨이와 암호문을 주고받는다"는 것만 보입니다.
| VPN 종류 | 쓰임 | 특징 |
|---|---|---|
| 원격 접속 VPN | 집·출장지의 PC가 기관 내부망에 접속 | 사용자 인증(비밀번호 + OTP 또는 인증서)이 핵심 |
| 사이트 간 VPN | 본사와 지사, 관측소와 연구소 네트워크를 상시 연결 | 양쪽 게이트웨이끼리 인증서·사전 공유 키로 인증 |
| IPsec | 사이트 간 연결에 많이 씀 | 네트워크 계층(L3)에서 IP 패킷을 통째로 암호화. 키 교환은 IKE |
| SSL/TLS VPN | 원격 접속(OpenVPN, 기관용 SSL VPN) | HTTPS와 같은 TLS 사용. 443번 포트로 방화벽을 잘 통과 |
| WireGuard | 원격 접속·사이트 간 모두 | 코드가 짧고 빠른 최신 방식. UDP 위에서 ChaCha20-Poly1305로 암호화 |
👉 VPN을 켜고 끄며, 카페의 공용 Wi-Fi에서 엿보는 사람에게 관측 장비 제어 명령이 어떻게 보이는지 비교해 보세요!
바깥 헤더 크기는 WireGuard(IPv4) 기준입니다. 안쪽 패킷은 브라우저의 진짜 AES-GCM으로 암호화해 보여 주며(WireGuard는 실제로 ChaCha20-Poly1305 사용), 세션 키는 접속할 때마다 키 교환으로 새로 만듭니다. 주소는 설명용 예시입니다.
🧮 실제 값으로 계산해 보기 — VPN 포장은 얼마나 클까?
VPN에 접속할 때는 다음 과정이 몇 초 안에 일어납니다. ①~④에서 배운 인증과 통신 보안 편의 키 교환·대칭키 암호가 모두 쓰입니다.
VPN은 만능이 아닙니다. 접속한 PC가 이미 악성 코드에 감염되어 있으면 그 악성 코드도 터널을 타고 내부망에 들어옵니다. 또 VPN 운영자(게이트웨이)는 터널 안의 내용을 볼 수 있으므로, 믿을 수 있는 곳의 VPN만 써야 하고, 터널 안에서도 중요한 통신은 HTTPS·SSH로 한 번 더 암호화하는 것이 좋습니다.
기관에는 서버가 수십 대 있는데, 서버마다 따로 계정을 만들면 관리가 어렵고 퇴직자 계정을 지우는 것도 잊기 쉽습니다. 그래서 계정과 비밀번호·OTP 확인을 인증 서버 한 곳에 모으고, VPN·메일·업무 시스템은 "이 사람 맞나요?"를 인증 서버에 물어봅니다.
| 구성 요소 | 하는 일 |
|---|---|
| 디렉터리 (LDAP, AD) | 사용자 계정·소속·그룹을 한곳에 저장. 퇴직하면 여기서만 막으면 모든 시스템에서 막힘 |
| RADIUS 서버 | VPN 게이트웨이·무선랜이 사용자 인증을 맡기는 표준 인증 서버. OTP 확인도 여기서 하는 경우가 많음 |
| 단일 로그인 (SSO) | 한 번 로그인하면 여러 서비스에 다시 로그인하지 않고 들어감. SAML·OpenID Connect 같은 표준 사용 |
| 세션·토큰 | 로그인에 성공하면 서버가 '로그인 증표'(세션 ID, 토큰)를 주고, 이후 요청은 이 증표로 확인. 증표는 일정 시간이 지나면 만료 |
| 접속 기록 | 누가, 언제, 어디서 로그인했고 실패했는지 남겨 이상한 로그인을 찾아냄(통신 보안 편의 보안 관제) |
전파망원경은 산꼭대기나 섬처럼 먼 곳에 있는 경우가 많아, 연구자와 운영자가 원격으로 관측을 확인하고 장비를 관리합니다. 이때 관측 장비의 제어 프로그램은 대부분 암호화나 인증이 없도록 만들어져 있어, 인터넷에 직접 열면 매우 위험합니다(예: 대용량 데이터 전송 및 수신 편의 jive5ab 제어 포트). 그래서 다음과 같이 겹겹이 지킵니다.
📖 용어 및 약자 설명
| 용어·약자 | 원어(풀이) | 뜻 |
|---|---|---|
| 사용자 인증 | ||
| 인증 / 인가 | authentication / authorization | 누구인지 확인하기 / 확인된 사람이 할 수 있는 일을 정하기 |
| 인증 요소 | authentication factor | 아는 것(비밀번호), 가진 것(OTP 기기·보안키), 나 자신(생체) |
| MFA / 2FA | Multi-Factor / Two-Factor Authentication | 서로 다른 종류의 인증 요소를 둘 이상 / 두 가지 쓰는 인증 |
| PIN | Personal Identification Number | 짧은 숫자 비밀번호 |
| 솔트 | salt | 비밀번호마다 섞는 무작위 값. 같은 비밀번호도 저장값이 달라짐 |
| PBKDF2 | Password-Based Key Derivation Function 2 | 해시를 여러 번 반복해 비밀번호 대입을 느리게 만드는 표준 함수 |
| 레인보 테이블 | rainbow table | 흔한 비밀번호의 해시를 미리 계산해 둔 표. 솔트로 무력화 |
| OTP | One-Time Password | 한 번만 쓰는 비밀번호(일회용 패드 One-Time Pad와는 다름) |
| TOTP / HOTP | Time-based / HMAC-based OTP | 시각(30초 칸)으로 바뀌는 OTP / 누른 횟수로 바뀌는 OTP |
| HMAC | Hash-based Message Authentication Code | 비밀 키와 해시 함수로 만드는 검사값. 키가 없으면 같은 값을 만들 수 없음 |
| SHA-1 / SHA-256 | Secure Hash Algorithm | 해시 함수. TOTP 표준의 기본은 SHA-1(HMAC 안에서는 여전히 안전하게 쓰임) |
| Base32 | — | 비밀 키를 A~Z, 2~7 글자로 적는 방식. OTP 등록 QR 코드에 사용 |
| 재전송 공격 | replay attack | 엿본 인증 값을 그대로 다시 보내 로그인하려는 공격 |
| 챌린지-응답 | challenge-response | 서버가 매번 다른 문제를 내고 사용자가 비밀로만 풀 수 있는 답을 돌려주는 인증 |
| ECDSA / P-256 | Elliptic Curve Digital Signature Algorithm | 타원곡선 전자서명 / 그중 많이 쓰는 256비트 곡선 |
| FIDO2 · WebAuthn · 패스키 | Fast IDentity Online 2 · Web Authentication · passkey | 공개키로 로그인하는 국제 표준 · 그 웹 브라우저 규격 · 이를 쓰는 로그인 수단 |
| 오리진 | origin | 사이트를 구분하는 '규약 + 주소 + 포트'(예: https://www.kasi.re.kr) |
| 피싱 | phishing | 진짜처럼 꾸민 가짜 사이트·문자로 비밀번호 등을 빼내는 속임수 |
| VPN | ||
| VPN | Virtual Private Network | 가상 사설망. 인터넷 위에 암호화된 전용 통로를 만듦 |
| 터널링 / 캡슐화 | tunneling / encapsulation | 원래 패킷을 다른 패킷 안에 통째로 담아 보내기 |
| 게이트웨이 | gateway | 터널의 출입구 역할을 하는 서버·장비 |
| IPsec / IKE / ESP | IP Security / Internet Key Exchange / Encapsulating Security Payload | IP 계층 VPN 규약 / 그 키 교환 규약 / 패킷을 암호화해 담는 형식 |
| SSL/TLS VPN | Secure Sockets Layer / Transport Layer Security | HTTPS와 같은 TLS로 만든 VPN(예: OpenVPN) |
| WireGuard | — | 간결하고 빠른 최신 VPN 규약. 2020년 리눅스 커널에 포함 |
| ChaCha20-Poly1305 / AES-GCM | — | 암호화와 변조 검사를 함께 하는 대칭키 암호 방식 |
| 분할 터널링 | split tunneling | 내부망으로 가는 통신만 VPN으로, 나머지는 바로 인터넷으로 보내는 설정 |
| MTU | Maximum Transmission Unit | 한 번에 보낼 수 있는 IP 패킷의 최대 크기(보통 1,500바이트) |
| 인증 서버와 로그인 관리 | ||
| LDAP / AD | Lightweight Directory Access Protocol / Active Directory | 사용자 계정을 모아 두는 디렉터리 규약 / 마이크로소프트의 디렉터리 서비스 |
| RADIUS | Remote Authentication Dial-In User Service | VPN·무선랜이 인증을 맡기는 표준 인증 서버 규약 |
| SSO | Single Sign-On | 한 번 로그인으로 여러 서비스 이용 |
| SAML / OIDC | Security Assertion Markup Language / OpenID Connect | SSO에서 "이 사람은 인증되었다"는 증명을 주고받는 표준 |
| 세션 / 토큰 | session / token | 로그인 뒤 서버가 주는 로그인 증표. 일정 시간 뒤 만료 |
| SSH 키 | Secure Shell key | 서버 원격 접속에 비밀번호 대신 쓰는 공개키·개인키 쌍 |
| RFC | Request for Comments | 인터넷 표준 문서 번호(예: TOTP는 RFC 6238) |
| OWASP | Open Worldwide Application Security Project | 웹 보안 정보를 공개하는 국제 비영리 단체 |
🧑🏫 선생님·학부모님을 위한 설명 도움말
원리 자세히 보기
인증과 VPN이 발전해 온 역사
| 시기 | 사건 | 의미 |
|---|---|---|
| 1960년대 초 | 컴퓨터 비밀번호의 등장 | 미국 MIT의 시분할 컴퓨터(CTSS)에서 여러 사람이 컴퓨터를 나눠 쓰며 사용자마다 비밀번호를 두기 시작했습니다. |
| 1979년 | 솔트와 해시로 비밀번호 저장 | 유닉스의 모리스와 톰프슨이 비밀번호를 솔트와 함께 해시로 저장하는 방법을 정리해 발표했습니다. |
| 1981년 | 램포트의 일회용 비밀번호 | 해시를 여러 번 겹쳐 만든 사슬로 매번 다른 비밀번호를 쓰는 방법이 제안되었습니다. OTP의 출발점입니다. |
| 1990년대 | VPN 규약의 등장 | PPTP, IPsec(1998년 표준 정비) 같은 VPN 규약이 나와 기업들이 인터넷으로 지점을 연결하기 시작했습니다. |
| 2000년 | PBKDF2 표준 | 비밀번호 해시를 여러 번 반복하는 방법이 인터넷 표준(RFC 2898)으로 정해졌습니다. |
| 2001년 | OpenVPN | TLS를 이용한 공개 소프트웨어 VPN이 나와 널리 쓰이게 되었습니다. |
| 2005년 / 2011년 | HOTP / TOTP 표준 | 횟수 기반(RFC 4226)과 시간 기반(RFC 6238) OTP가 표준이 되어, 서로 다른 회사의 인증 앱과 서버가 함께 동작하게 되었습니다. |
| 2019년 | WebAuthn 표준 | 웹 브라우저에서 공개키로 로그인하는 규격이 W3C 권고안이 되었습니다. |
| 2020년 | WireGuard | 간결한 최신 VPN 규약이 리눅스 커널에 정식으로 들어갔습니다. |
| 2022년 ~ | 패스키 확산 | 주요 운영체제·브라우저 회사들이 비밀번호 없는 로그인(패스키)을 함께 지원하기로 하면서 빠르게 퍼지고 있습니다. |
비유로 설명하기
자주 하는 오해
함께 해 볼 질문·활동
📚 참고 자료 및 출처
본 교육자료는 Anthropic(Claude) 및 OpenAI(ChatGPT)를 활용하여 제작하였으며, 제작자가 내용을 검토·편집하였습니다. 주요 참고자료와 출처는 각 페이지의 「참고 자료 및 출처」에 명시하였습니다. 출처가 별도로 표기되지 않은 페이지와 참고자료에 포함되지 않은 내용은 제작자가 직접 작성하거나 정리한 것입니다. 내용에 오류가 있거나 수정이 필요한 사항을 발견하시면 kvnsite@kasi.re.kr로 알려 주시기 바랍니다.