한국어
  • mfa
  • 2fa
  • totp
  • nodejs
  • security
  • authentication
  • authenticator app
  • otplib

Node.js 에서 인증자 앱을 사용하여 이중 인증 (2FA) 구현하는 방법

인증자 앱, TOTP 및 otplib 라이브러리를 사용하여 Node.js 에서 이중 인증 (2FA)을 구현하는 방법을 배웁니다. 이 단계별 가이드는 QR 코드 생성부터 인증 코드 확인까지 모든 것을 다룹니다.

Yijun
Yijun
Developer

이중 인증 (2FA)이란 무엇인가

전통적인 애플리케이션에서는 일반적으로 이메일/사용자 이름/전화번호를 우리의 신원 식별자로 사용합니다. 이러한 신원 식별자와 해당 비밀번호 또는 인증 코드를 결합하여 인증 과정을 완료합니다.

그러나 보안 요구 사항이 더 높은 시나리오에서는 신원 식별자만으로 인증을 하는 것이 충분하지 않습니다. 이는 이러한 신원 식별자와 해당 인증 정보가 유출될 수 있기 때문입니다.

이곳에서 이중 인증 (2FA)이 등장합니다 - 사용자가 두 가지 다른 인증 요소를 제공하여 신원을 확인해야 하는 추가 보안 계층입니다. 이는 계정에 접근하려는 사람이 진정한 합법 사용자임을 보장합니다.

일반적인 2FA 방법에는 다음이 포함됩니다:

  • 인증자 앱을 사용한 TOTP 인증
  • 생체 인증
  • 디바이스 기반 인증
  • SMS 인증 코드

이 튜토리얼에서는 Node.js 애플리케이션에서 otplib 라이브러리를 사용한 인증자 앱을 통한 TOTP 기반 2FA 구현에 초점을 맞춥니다.

TOTP 인증이란 무엇인가?

TOTP는 시간 기반 일회성 비밀번호의 약자입니다. 위키피디아에 따르면, 이는 컴퓨터 알고리즘으로 현재 시간을 고유성의 소스로 사용하여 생성하는 일회용 비밀번호를 가리킵니다.

사용자의 전화와 앱 서버 간에 공유된 TOTP 비밀 키를 사용하면, 사용자의 전화와 앱 서버는 특정 시간에 동일한 TOTP 코드를 생성할 수 있습니다:

TOTP 생성은 시간에 의존하기 때문에 오프라인으로 계산할 수 있습니다. 또한, TOTP는 숫자 문자열을 생성하기 때문에 간단하고 사용자 친화적입니다. 따라서 TOTP 확인은 2가지 요인 인증 수단으로 널리 사용됩니다.

TOTP를 2가지 요인 인증 방법으로 사용하는 사용자는 종종 TOTP 비밀을 저장하고 TOTP 코드를 생성하는 데 어려움을 겪습니다. 여기서 인증자 앱이 큰 도움이 됩니다. 인증자 앱을 사용하여 TOTP 비밀을 저장하고 인증자 앱이 자동으로 TOTP 코드를 생성하도록 할 수 있습니다. 인증이 필요할 때 인증자 앱을 열기만 하면 TOTP 비밀에 해당하는 TOTP 코드를 얻을 수 있습니다. 인기 있는 인증자 앱에는 Google AuthenticatorMicrosoft Authenticator이 포함됩니다.

TOTP를 이중 인증으로 구현하는 과정은 두 단계로 나누어집니다:

  1. 사용자에게 TOTP 비밀을 바인드합니다.
  2. 관련된 TOTP 비밀에 따라 사용자의 TOTP 코드를 확인합니다.

사용자에게 TOTP를 바인드하는 과정은 다음과 같습니다:

한 번 사용자에게 TOTP가 바인드되면 인증에 사용할 수 있습니다. 과정은 다음과 같습니다:

다이어그램에서 설명한 것처럼, 사용자 측에서는 인증자 앱을 사용하여 TOTP 비밀을 관리하고 TOTP 코드를 생성합니다. 서버 측에서는 사용자로부터 전송받은 TOTP 코드를 확인하기 위해 TOTP 비밀을 생성하고 TOTP 코드를 검증하는 기능을 지원해야 합니다. 이 글에서는 서버 측에 TOTP 관련 기능을 통합하기 위해 otpllib 예제를 사용할 것입니다.

otplib을 사용하여 Node.js 앱에 TOTP 기반 2FA 구현

앱이 Express.js 기반이며, 사용자가 /sign-in 엔드포인트를 통해 로그인한다고 가정할 때, 사용자 로그인 과정에서 TOTP를 지원하기 위한 계획은 다음과 같습니다:

  1. 사용자가 TOTP에 바인드되지 않은 경우, TOTP 비밀을 QR 코드 형태로 사용자에게 전송하고 TOTP 바인드를 요청합니다.
  2. 사용자가 TOTP에 이미 바인드된 경우, TOTP 확인을 요청합니다.

먼저 프로젝트의 종속성을 설치합니다: otplibqrcode:

그 다음, /sign-in 엔드포인트를 강화합니다.

우리 구현에 따르면, 사용자가 TOTP에 바인드되지 않은 경우 QR 코드를 프론트엔드로 전송합니다:

TOTP 바인드

사용자는 인증자 앱으로 QR 코드를 스캔하고, 인증자 앱은 TOTP 코드를 생성하고 관련된 TOTP 비밀을 저장합니다.

Google 인증자

사용자는 얻은 TOTP 코드를 앱 서버로 다시 전송합니다. 코드가 성공적으로 확인되면 이 TOTP를 사용자에게 바인드할 수 있습니다.

따라서 사용자가 보낸 TOTP 코드를 수신하기 위한 /verify-totp API를 구현합니다:

이렇게 하면 사용자를 위한 TOTP를 성공적으로 바인드했습니다. 이후 사용자가 로그인할 때, 인증자 앱을 열고 이전에 바인드된 TOTP 비밀에 해당하는 확인 코드를 보내기만 하면 인증 과정이 완료됩니다.

TOTP 확인

/verify-totp API에서는 사용자가 이전에 바인드한 TOTP 비밀을 사용하여 TOTP 코드를 검증합니다.

요약

이 글을 기반으로, 당신은 이제 앱에 인증자 앱 확인 기능을 통합할 수 있어야 합니다.

그러나 이것은 단순한 예일 뿐입니다. 앱이 크거나 복잡해질 가능성이 있다면 새로운 인증 방법을 통합하는 것이 상당한 비용을 발생시킬 수 있습니다.

좋은 소식은: Logto는 포괄적인 신원 인증 솔루션 제공자로서 인증자 앱 검증을 포함한 다요소 인증 (MFA)을 지원합니다. Logto를 활용하면 몇 분 만에 MFA로 안전하고 효율적인 사용자 로그인 프로세스를 애플리케이션에 원활하게 통합할 수 있습니다!