2FA 완벽 가이드 - TOTP, SMS, 하드웨어 키 비교와 구현
이중 인증(2FA)의 종류와 보안 수준. TOTP 앱, SMS, 하드웨어 키의 장단점과 개발자를 위한 구현 가이드.
Toolypet Team
Development Team
2FA 완벽 가이드: 무엇을, 왜, 어떻게
비밀번호가 유출되면 끝입니다.
2024년 기준 유출된 비밀번호는 100억 개가 넘습니다. 아무리 강력한 비밀번호도 데이터베이스 해킹에는 무력합니다.
**2FA(이중 인증)**는 비밀번호가 유출되어도 계정을 보호합니다.
2FA란?
2FA(Two-Factor Authentication)는 두 가지 요소로 인증하는 방식입니다.
인증의 3요소
| 요소 | 의미 | 예시 |
|---|---|---|
| 지식 | 알고 있는 것 | 비밀번호, PIN |
| 소유 | 가지고 있는 것 | 휴대폰, 하드웨어 키 |
| 존재 | 본인인 것 | 지문, 얼굴 |
2FA는 이 중 두 가지를 조합합니다.
비밀번호(지식) + TOTP 앱(소유) = 2FA
PIN(지식) + 지문(존재) = 2FA
왜 필요한가
| 공격 유형 | 비밀번호만 | 2FA 적용 |
|---|---|---|
| 피싱 | ❌ 돌파 | ⚠️ 지연 또는 차단 |
| 무차별 대입 | ❌ 돌파 가능 | ✅ 차단 |
| DB 유출 | ❌ 돌파 | ✅ 차단 |
| 어깨너머 훔쳐보기 | ❌ 돌파 | ✅ 차단 |
2FA 유형 비교
1. SMS 인증
로그인 시도 → 휴대폰으로 6자리 코드 수신 → 입력
| 장점 | 단점 |
|---|---|
| 추가 앱 불필요 | SIM 스와핑 공격 취약 |
| 사용자 친숙 | 피싱에 취약 |
| 빠른 도입 | 통신 필요 |
보안 등급: ⭐⭐☆☆☆ (낮음)
SMS는 유심 복제(SIM 스와핑) 공격에 취약합니다. 공격자가 통신사를 속여 유심을 복제하면 SMS를 가로챌 수 있습니다.
2. TOTP 앱 (권장)
시간 기반 일회용 비밀번호
30초마다 새 코드 생성
앱 예시: Google Authenticator, Authy, 1Password
| 장점 | 단점 |
|---|---|
| 오프라인 작동 | 앱 설치 필요 |
| SIM 스와핑 면역 | 복구 키 분실 위험 |
| 무료 | 기기 분실 시 문제 |
보안 등급: ⭐⭐⭐⭐☆ (높음)
3. 하드웨어 보안 키
USB 또는 NFC로 물리적 인증
예: YubiKey, Google Titan Key
| 장점 | 단점 |
|---|---|
| 피싱 완전 차단 | 비용 (30~70달러) |
| 가장 강력한 보안 | 물리적 분실 위험 |
| 사용 간편 | 모든 서비스 미지원 |
보안 등급: ⭐⭐⭐⭐⭐ (최고)
4. 앱 푸시 인증
로그인 시도 → 앱에 푸시 알림 → 승인/거부
예: Microsoft Authenticator, Duo
| 장점 | 단점 |
|---|---|
| 사용 편리 | 인터넷 필요 |
| 피싱 저항성 | 앱 의존 |
보안 등급: ⭐⭐⭐⭐☆ (높음)
TOTP 작동 원리
개념
TOTP = HMAC-SHA1(비밀키, 시간) → 6자리 숫자
- 서버와 앱이 **비밀키(secret)**를 공유
- 현재 시간을 30초 단위로 나눔
- 비밀키 + 시간으로 해시 생성
- 해시에서 6자리 숫자 추출
서버와 앱이 같은 시간, 같은 키를 사용하므로 같은 코드가 생성됩니다.
QR 코드의 내용
otpauth://totp/서비스:계정?secret=BASE32비밀키&issuer=서비스
otpauth://totp/GitHub:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub
QR 코드를 스캔하면 앱이 이 정보를 저장합니다.
개발자를 위한 TOTP 구현
Node.js 예시 (otplib)
const { authenticator } = require('otplib');
// 1. 비밀키 생성 (사용자 등록 시)
const secret = authenticator.generateSecret();
// "JBSWY3DPEHPK3PXP"
// 2. QR 코드 URL 생성
const otpauthUrl = authenticator.keyuri(
'user@example.com',
'MyApp',
secret
);
// QR 라이브러리로 이미지 생성
// 3. 코드 검증 (로그인 시)
const userToken = "123456"; // 사용자 입력
const isValid = authenticator.verify({ token: userToken, secret });
if (isValid) {
console.log("인증 성공");
} else {
console.log("잘못된 코드");
}
Python 예시 (pyotp)
import pyotp
# 1. 비밀키 생성
secret = pyotp.random_base32()
# 2. QR 코드 URL
totp = pyotp.TOTP(secret)
url = totp.provisioning_uri(name='user@example.com', issuer_name='MyApp')
# 3. 코드 검증
user_token = "123456"
is_valid = totp.verify(user_token)
보안 고려사항
// ✅ 시간 드리프트 허용 (앞뒤 30초)
authenticator.options = {
window: 1 // -30초 ~ +30초 허용
};
// ✅ 재사용 방지
// 사용된 코드를 저장하고 같은 코드 재사용 차단
const usedCodes = new Set();
function verifyOnce(token, secret) {
if (usedCodes.has(token)) return false;
if (authenticator.verify({ token, secret })) {
usedCodes.add(token);
// 60초 후 삭제 (메모리 관리)
setTimeout(() => usedCodes.delete(token), 60000);
return true;
}
return false;
}
복구 코드 관리
2FA를 잃어버리면 계정에 접근할 수 없습니다. 복구 코드를 반드시 제공하세요.
생성
const crypto = require('crypto');
function generateRecoveryCodes(count = 10) {
const codes = [];
for (let i = 0; i < count; i++) {
// 8자리 대문자+숫자
const code = crypto.randomBytes(4).toString('hex').toUpperCase();
codes.push(`${code.slice(0,4)}-${code.slice(4)}`);
}
return codes;
}
// ["A3F8-B2C1", "D4E5-F6G7", ...]
저장
// 복구 코드는 해싱해서 저장 (bcrypt 권장)
const bcrypt = require('bcrypt');
async function storeRecoveryCodes(codes) {
const hashedCodes = await Promise.all(
codes.map(code => bcrypt.hash(code, 10))
);
// DB에 hashedCodes 저장
}
// 사용 시 검증
async function useRecoveryCode(inputCode, hashedCodes) {
for (const hashed of hashedCodes) {
if (await bcrypt.compare(inputCode, hashed)) {
// 코드 삭제 (일회용)
return true;
}
}
return false;
}
사용자 경험 (UX) 팁
1. 2FA 설정 유도
첫 로그인 후: "계정 보안을 위해 2FA를 설정하세요"
민감한 작업 전: "이 작업을 위해 2FA가 필요합니다"
2. 단계별 안내
1단계: 인증 앱 설치 (Google Authenticator 링크 제공)
2단계: QR 코드 스캔
3단계: 6자리 코드로 확인
4단계: 복구 코드 저장 (강조!)
3. 복구 코드 강조
⚠️ 이 코드를 안전한 곳에 저장하세요.
분실 시 계정 복구가 불가능합니다.
[ 코드 다운로드 ] [ 코드 복사 ]
FAQ
Q: SMS 2FA는 아예 안 쓰는 게 좋나요?
A: TOTP보다 약하지만, 없는 것보다 훨씬 낫습니다. 가능하면 TOTP나 하드웨어 키를 사용하되, SMS만 지원하는 서비스면 반드시 활성화하세요.
Q: 2FA 앱이 있는 폰을 잃어버리면?
A: 복구 코드로 로그인 후 2FA를 재설정합니다. 그래서 복구 코드를 별도로 안전하게 보관해야 합니다.
Q: 백업용 2FA를 등록해도 되나요?
A: 네, 같은 계정에 여러 기기를 등록하거나(서비스가 지원하면), 처음 QR 스캔 시 여러 기기에서 동시에 스캔하면 됩니다.
요약
| 2FA 유형 | 보안 | 편의성 | 권장 |
|---|---|---|---|
| SMS | ⭐⭐ | ⭐⭐⭐⭐⭐ | 최후 수단 |
| TOTP 앱 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ 일반 권장 |
| 하드웨어 키 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 고보안 |
| 앱 푸시 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 기업용 |
최소한 TOTP를 사용하세요. 비밀번호만으로는 충분하지 않습니다.
관련 도구
저자 소개
Toolypet Team
Development Team
The Toolypet Team creates free, privacy-focused web tools for developers and designers. All tools run entirely in your browser with no data sent to servers.