Toolypet
블로그로 돌아가기
Security

2FA 완벽 가이드 - TOTP, SMS, 하드웨어 키 비교와 구현

이중 인증(2FA)의 종류와 보안 수준. TOTP 앱, SMS, 하드웨어 키의 장단점과 개발자를 위한 구현 가이드.

Toolypet Team

Toolypet Team

Development Team

6 분 읽기

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자리 숫자
  1. 서버와 앱이 **비밀키(secret)**를 공유
  2. 현재 시간을 30초 단위로 나눔
  3. 비밀키 + 시간으로 해시 생성
  4. 해시에서 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를 사용하세요. 비밀번호만으로는 충분하지 않습니다.


관련 도구

도구용도
TOTP 생성기2FA 코드 테스트
비밀번호 생성기강력한 비밀번호
해시 생성기해싱 테스트
2FAMFATOTP인증보안개발

저자 소개

Toolypet Team

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.

Web DevelopmentCSS ToolsDeveloper ToolsSEOSecurity