배움터
2FA란 무엇인가? 그리고 그 30초짜리 코드는 도대체 어떻게 작동할까?
알기 쉽게 정리한 완전한 안내서입니다. 2단계 인증이 무엇인지, 6자리 TOTP 코드 뒤에 숨은 암호학, 어느 계정에 어느 인증 요소를 켜야 하는지, 그리고 절대 계정에서 잠기지 않는 방법까지.
비밀번호만으로는 부족한 이유
모든 로그인에는 비밀번호가 필요한데, 비밀번호에는 구조적인 문제가 세 가지 있습니다. 다른 곳에 재사용되고, 유출된 데이터베이스를 노린 크리덴셜 스터핑 공격으로 맞혀지고, 사람들에게서 낚여 나옵니다. 2단계 인증(2FA)은 “사람이 가장 약한 고리다”라는 냉정한 사실을 인정하고, 공격자가 추가로 손에 넣어야 하는 독립된 두 번째 요소를 더합니다. 2FA가 있으면 유출된 비밀번호만으로는 더 이상 내 계정에 들어갈 수 없습니다.
이제 대부분의 주요 서비스가 2FA를 제공하거나 요구합니다. GitHub는 2023년부터 강제하고 있고, 암호화폐 거래소(Binance, Coinbase, Kraken)는 시장이 출렁일 때마다 설정을 재촉하며, Microsoft, Google, Apple은 계정 보안의 기본값에 넣었습니다.
세 가지 인증 요소
인증 요소는 세 부류로 나뉩니다.
- 아는 것 — 비밀번호, PIN. 도입이 싸지만 낚이기 쉽습니다.
- 가진 것 — 코드를 만들어 내는 인증기, 하드웨어 보안 키 또는 패스키, SMS를 받는 휴대폰. 2FA가 사는 바로 이 자리입니다.
- 본인인 것 — 지문, 얼굴 인식. 편리하지만 기기 안에서 등록되므로 원격 인증의 주된 축으로 쓰이지는 않습니다.
진짜 “2요소” 인증은 서로 다른 두 부류에 걸쳐 기술을 조합합니다. 비밀번호와 휴대폰의 패턴 잠금을 묶으면 2FA가 아니고, 비밀번호와 30초마다 바뀌는 인증기 코드를 묶어야 2FA입니다.
TOTP의 작동 방식, 단계별로
- 등록. 서비스에서 2FA를 켜면 무작위 비밀이 만들어져 단 한 번만 여러분과 공유됩니다 — QR 코드로 그려지거나 Base32 설정 키로 표시되는 형태입니다. 보안 용어로 말하면 모든 위험이 이 한 순간에 몰려 있으므로, 신뢰하는 곳에서만 키를 꺼내 보여야 합니다.
- 시간은 흐르고. 현재 시각을 30초짜리 “계단”으로 나눕니다:
step = floor(unixTime / 30). 30에 특별한 뜻은 없습니다. RFC 6238은 서비스가 15, 30 또는 60초를 선택하는 것도 허용합니다. - HMAC. 인증기는 비밀 키를 재료로 삼아 계단 값 위로 HMAC 해시를 계산합니다(대부분의 서비스는 SHA-1, 어쩌다 SHA-256/512). HMAC은 한 방향으로만 흐르는 구조입니다. 결과를 보더라도 비밀에 대해 아무것도 알 수 없습니다.
- 숫자 뽑기. HMAC 출력의 네 바이트를 마지막 4비트(니블)로 고르고, 최상위 비트를 지운 뒤, 결과를 10n으로 나눈 나머지가 여러분의 코드가 됩니다 — 보통 n = 6, 가끔 7 또는 8입니다.
- 검증 창. 서버는 현재 계단과 바로 전의 계단에 대해 같은 값을 다시 계산합니다(시계가 조금 어긋나도 받아들이려는 여유입니다). 일치하면 증명이 채택되고 로그인이 받아들여집니다.
여기까지의 모든 계산은 마이크로초 단위로, 전부 기기 안에서 끝납니다. 그래서2FA COUNTER 같은 클라이언트 사이드 도구가 이 일 전체를 혼자서 해낼 수 있습니다 — 페이지를 불러오고 인터넷을 끊어도 코드는 30초마다 계속 흘러 나오며, 언제까지고 그렇습니다.
비밀과 QR 코드
Base32 문자열은 어떤 중간 형식이 아닙니다 — 비밀의 날것 바이트를 휴대폰에서 다루기 좋은 글자판(A–Z에 2–7을 더한 것, 혼동하기 쉬운 0과 1은 일부러 뺐고 어떤 키보드에서도 안전합니다)으로 옮겨 적은 것입니다. 플랫폼이 “스캔이 안 되나요?”를 제공할 때 나오는 문자열은 QR이 담고 있는 정확히 같은 비밀 재료를 포함합니다. 어느 형태든 저장해 두면 되고, 의미는 완전히 같습니다:
otpauth://totp/GitHub:you%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub
otpauth://totp/Binance:me?secret=JBSWY3DPEHPK3PXP&digits=6&period=30&algorithm=SHA1
otpauth://hotp/Steam:sda?secret=...&counter=5 ← 카운터 기반(HOTP) 방식요즘 생성기는 매개변수를 하나도 안 빼고 존중합니다. 자릿수, 주기, 해시 알고리즘, HOTP 카운터 — SHA-256을 지정한 서비스가 기본값인 SHA-1 코드를 계속 거부할 것이므로 필요한 일입니다. Base32 키만 담긴 입력은 6자리, 30초, SHA-1의 표준 기본값을 따르며, 대부분의 서비스가 바로 이 기본값을 사용합니다.
TOTP vs SMS vs 하드웨어 키
- SMS 코드는 통신망을 건너갑니다. SIM 스와핑 공격으로 번호가 통째로 빼앗기면 공격자가 모든 코드를 대신 받아 가게 됩니다. 미국 표준(NIST SP 800-63B)은 SMS를 인증 수단으로 폐기했습니다.
- TOTP는 아무것도 전송하지 않습니다 — 코드는 로컬에서 계산되고 30초 안에 만료됩니다. 무료이고, 표준에 기반하고, 어디서든 지원됩니다. 약점은 유효 시간 안에 낚여 나올 수 있다는 점입니다.
- 보안 키와 패스키(WebAuthn/FIDO2)는 정확히 그 도메인에 암호학적으로 묶이므로, 사칭 페이지는 자동으로 실패합니다. 가장 강력한 선택지지만 지원이 덜 널리 퍼져 있고 키 값도 듭니다.
현실적인 사다리: 어쩔 수 없을 때만 SMS, 기본값은 TOTP, 가장 소중한 계정에는 하드웨어 키나 패스키.
절충점을 깊게 파헤친 글: TOTP 대 패스키 — 어느 요소를 어디에 둘까, SIM 스와핑 공격이 SMS 코드를 어떻게 깨는지, 그리고 앱 클라우드 동기화가 비밀 키에 미치는 영향.
2FA가 막지 못하는 것
2단계 인증이 해결하는 것은 비밀번호 탈취입니다. 세션 쿠키 훔치기(이미 여러분 컴퓨터에서 돌고 있는 악성코드), 권한을 너무 넓게 받아 가는 브라우저 확장, 손을 뗀 복구 이메일, 그리고 공격자가 30초 유효 시간 안에 새 코드를 읽어 주도록 압박하는 사회공학에는 효과가 없습니다. 브라우저를 항상 최신으로 두고, 확장은 아낌없이 정리하고, 절박한 톤으로 코드를 요구하는 요청은 본색 그대로 위험 신호로 다루세요.
절대 잠기지 않는 방법
- 백업 코드를 저장하세요. 2FA를 켤 때 모든 서비스가 일회용 복구 코드 묶음을 출력해 줍니다. 인쇄하거나 암호화해 오프라인에 보관하세요.
- 도구가 아니라 비밀을 지키세요. Base32 키를 비밀번호 관리자 금고에 적어 두면 어떤 인증기로도 코드를 다시 만들 수 있습니다 — 휴대폰 앱이든,브라우저 기반 생성기든, 그날 실제로 가진 어떤 기기에서든.
- 기기 두 대에 등록하세요. 같은 비밀은 두 개의 신뢰하는 기기에 동시에 살아도 안전합니다. TOTP는 결정적입니다. 비밀이 같으면 코드도 같습니다.
- 시계를 지켜 보세요. 코드가 자주 튕기면 가장 먼저 기기의 시간 동기화를 고치세요. “코드가 올바르지 않습니다” 오류의 단연코 1위 원인이며, 어떤 도구도 이를 우회할 수 없습니다.
FAQ
2FA란 무엇인가요?
2FA(2단계 인증)는 서로 다른 두 종류의 증거로 자신을 증명하는 방식입니다. “아는 것”(비밀번호)에 “가진 것”(30초마다 새로 만들어지는 코드, 보안 키, 휴대폰)을 더합니다. 비밀번호만으로는 유출되거나 맞혀지기 쉽습니다. 두 번째 요소가 있으면 유출된 비밀번호만으로는 아무것도 할 수 없어집니다.
2FA는 왜 그렇게 중요한가요?
비밀번호가 계속 무너지고 있기 때문입니다. 수십억 개의 실제 비밀번호가 데이터 유출로 이미 공개돼 있고, 공격자들은 그것들로 하루 종일 다른 사람의 계정에 들어가고자 합니다(크리덴셜 스터핑). Microsoft에 따르면 2FA는 자동화된 계정 탈취 공격의 99.9% 이상을 막아 줍니다. 이메일, 은행, 소셜 미디어, 게임, 암호화폐 계정을 실제로 일어나는 위협에서 지키는 정확히 그 도구입니다.
2FA는 어디에 쓰이나요?
누군가 탐내 만 한 모든 로그인을 지킵니다. 이메일과 클라우드(Google, Microsoft, Apple), 은행·증권 계좌, 암호화폐 거래소(Binance, Coinbase, Kraken), 개발자 플랫폼(GitHub, AWS), 게임(Steam, Discord, Twitch), 소셜 계정(X, Instagram)에까지 쓰입니다. 회사에서는 VPN, 사내 메일, 관리자 콘솔에도 씁니다. 사이트에 “인증 앱” 옵션이 보인다면 그것이 바로 2FA입니다.
2FA는 어떻게 작동하나요?
비밀번호 다음에 서비스는 두 번째 확인을 요구합니다. 표준 방식인 TOTP(RFC 6238)에서는 인증기가 공유 비밀 키와 현재 시각으로 새 6자리 OTP 인증번호를 계산하고, 서버도 완전히 같은 계산을 해 두 결과를 비교합니다. 코드는 30초마다 새로 만들어지고 만료되면 아무 가치가 없어지므로, 유출된 비밀번호만으로는 더 이상 계정을 열 수 없습니다.
TOTP 코드는 어떻게 만들어지나요?
웹사이트가 비밀 키를 내줍니다(보통 QR 코드나 Base32 문자열 형태입니다). 인증기는 그 키를 재료 삼아 현재 30초 시간 구간 위로 HMAC을 계산하고(SHA-1, SHA-256 또는 SHA-512), 결과에서 6자리 숫자를 뽑아 냅니다. 웹사이트도 완전히 같은 계산을 해 비교합니다. 양쪽 모두 이미 비밀을 알고 있으므로 네트워크는 전혀 필요 없습니다.
2FA는 어떻게 받나요?
2FA는 보호하려는 계정에서 얻습니다. 해당 서비스의 설정을 열어 “보안” 또는 “로그인 및 보안”에서 “2단계 인증” 항목을 찾으세요. 인증 앱 옵션을 고르고 QR 코드를 스캔한 뒤(스캔이 안 되면 설정 키를 꺼내어), 인증기에 표시되는 코드를 입력해 확인합니다. 휴대폰 없이 코드를 받는 법을 단계별로 다룬 안내서가 있습니다: /ko/how-to-get-2fa-code/.
2FA는 어떻게 활성화하나요?
네 단계입니다: 1) 계정 또는 보안 설정을 열어 “2단계 인증”을 선택합니다. 2) “인증 앱 사용”을 고릅니다(될 수 있으면 SMS는 피하세요). 3) 인증기로 QR 코드를 스캔하거나 — 아니면 “스캔이 안 되나요?”를 눌러 설정 키를 저장합니다. 4) 실시간 코드를 입력해 마친 뒤 화면에 나타나는 백업/복구 코드를 내려받거나 인쇄해 둡니다. Google, GitHub, Discord, Binance 등 서비스별 설정 가이드는 /guides/에 있습니다.
2FA는 얼마나 강력한가요?
전적으로 두 번째 요소에 달려 있습니다. SMS는 가장 약합니다. SIM 스와핑으로 번호를 빼앗기면 코드도 함께 넘어갑니다. TOTP 인증기의 30초짜리 코드는 계산적으로 매우 강력합니다. 아무것도 전송되지 않고, 오프라인의 공격자가 유도할 수 없고, 몇 초면 만료됩니다. 하드웨어 보안 키와 패스키가 그다음입니다. 피싱에 저항하고 진짜 도메인에 암호학적으로 묶이기 때문입니다.
2FA가 100% 안전한가요?
아니요. 어떤 보안 장치도 100%는 아니며, 솔직한 2FA 안내서는 이를 분명히 말합니다. 2FA는 훔친 비밀번호를 노리는 공격을 막지만, 30초의 유효 시간 안에 가짜 사이트에 실시간 코드를 입력하면 그대로 낚이고, 기기에 이미 돌고 있는 악성코드는 세션 자체를 훔칠 수 있으며, SMS가 두 번째 요소라면 SIM 스와핑은 실재하는 위협입니다. 그래도 이런 위험을 모두 감수하더라도 2FA가 있는 계정이 없는 계정보다 훨씬 뚫기 어렵습니다.
2FA는 필수인가요?
법으로 강제하는 곳은 없지만, 서비스들은 하나둘 의무로 바꾸고 있습니다. GitHub는 2023년부터 코드 기여자에게 필수로 요구하고, 은행과 암호화폐 거래소는 강제 활성화하며, 직장 로그인에도 의무 적용하는 곳이 흔합니다. 그 외에는 선택 사항이긴 하나 강력히 권장됩니다. 가장 소중한 계정에는 사실상 필수로 취급하세요. 이메일이 첫 번째입니다. 받은 편지함이 넘어가면 나머지 모든 계정을 초기화할 수 있는 권한까지 넘어갑니다.
요즘은 모든 서비스가 2FA를 쓰나요?
비밀번호만으로 하던 시대가 무너졌기 때문입니다. 대규모 유출로 수십억 개의 인증 정보가 드러났고, 자동화된 크리덴셜 스터핑이 계정 탈취를 거의 공짜로 만들었으며, 플랫폼들은 그 후속 비용을 감당하기 싫어졌습니다. 규제도 겹쳤습니다. 미국 표준에서 NIST가 SMS 인증을 사실상 폐기했고, EU의 PSD2는 강력한 고객 인증을 요구합니다. 몇 개 거인이 2FA를 일반화하자 다른 서비스들도 뒤따랐습니다.
TOTP, HOTP, OTP는 뭐가 다른가요?
OTP는 “일회용 비밀번호”를 뜻하는 말일 뿐입니다. TOTP(시간 기반 OTP, RFC 6238)는 현재 시각에서 코드를 계산하므로 30초마다 바뀝니다. HOTP(RFC 4226)는 카운터 기반입니다. 각 코드를 한 번씩 쓴 뒤 카운터가 하나씩 늘어납니다. Google, Microsoft, Discord, GitHub 등 거의 모든 “인증 앱” 서비스는 TOTP를 사용합니다.
TOTP가 SMS 2FA보다 나은 이유는 무엇인가요?
SMS 코드는 통신망을 타고 이동하므로 도청되거나 SIM 스와핑 공격으로 훔쳐질 수 있고, 전달 자체가 실패하기도 합니다. TOTP 코드는 여러분 기기에서 계산되고, 전송되는 일이 없으며, 몇 초 안에 만료됩니다. NIST를 비롯한 보안 기구들은 인증 수단으로 SMS를 폐기했습니다.
TOTP 코드는 피싱 사이트에서 훔쳐 갈 수 있나요?
가능합니다 — 30초의 유효 시간 안에 가짜 페이지에 방금 만들어진 코드를 입력하면 공격자는 한 번 통하는 로그인을 넘겨받습니다. 그래서 피싱에 저항하는 요소(진짜 도메인에 암호학적으로 묶이는 하드웨어 보안 키와 패스키)를 제공하는 곳에서는 그것이 가장 강한 선택지입니다. TOTP는 SMS와 비밀번호보다 나을 뿐, 하드웨어 키보다는 약합니다.
2FA 비밀 키는 어디에 보관해야 하나요?
마스터 사본은 암호화된 비밀번호 관리자 금고에 보관하세요. 그러면 휴대폰을 쓸 수 없게 되더라도 신뢰하는 어떤 기기에서든 코드를 다시 만들 수 있습니다 — 2facounter.com 같은 브라우저 도구로도요. 또한 2FA를 켤 때 각 서비스가 보여 주는 백업/복구 코드도 반드시 저장해 두세요. 그것이 진짜 에어백입니다.