티스토리 뷰

반응형

웹 또는 모바일 서비스를 개발하다 보면, "로그인" 기능은 항상 빠지지 않는 필수 요소이다.

하지만 단순히 아이디와 비밀번호만 일치하면 로그인 처리하는 방식은 이제는 보안적으로 너무 약하다.

그래서 요즘은 2FA(2단계 인증, 2 Factor Authenticaion), 특히 OTP(일회용 비밀번호) 기반 인증 방식이 많이 사용되는데

이번 프로젝트에서는 실제 서비스에서 사용되는 OTP 기반 2단계 인증 흐름을 직접 설계하고 구현해보겠다.

 

✨ 시리즈 구성

1. OTP 기반 2단계 인증 시스템 직접 구현해보기 - 1 시스템 아키텍처 및 3단계 인증 흐름 

2. OTP 기반 2단계 인증 시스템 직접 구현해보기 - 2 인증 서버를 구현해보자.

3. OTP 기반 2단계 인증 시스템 직접 구현해보기 - 3 비즈니스 논리 서버를 구현해보자.

4. OTP 기반 2단계 인증 시스템 직접 구현해보기 - 4 인증 서버와 비즈니스 논리 서버가 잘 동작하는지 확인해보자.

5. OTP 기반 2단계 인증 시스템 직접 구현해보기 - 5 멀티 모듈 구조를 MSA 구조로 리팩토링해보자.

 

✍️ 목표

단순한 로그인 기능이 아니라,

  • 사용자 인증
  • OTP 발급 및 검증
  • JWT 기반 인증 토큰 발급
  • Stateless 구조 기반의 보안 처리까지
    전체 인증 시스템의 흐름과 구조를 직접 설계하고 구축해보자.

 

🧩  시스템 아키텍처

 

  • 클라이언트: (Postman 또는 실제 앱/웹 프론트)
  • 인증 서버: 사용자 ID/PW 인증, OTP 생성 및 검증, 최종 JWT 발급
  • 비즈니스 서버: 보호된 API 제공, JWT 기반 인증 적용

 

🔐 3단계로 이루어진 인증 절차

1단계

  : 사용자가 이름(username), 비밀번호(password)를 입력해 로그인을 시도한다.

    이 요청이 비즈니스 서버의 /login 엔드포인트로 전달되며,

    서버는 인증 서버와 연동해 사용자 자격 증명(아이디, 비밀번호)를 확인한다.

    인증에 성공하면 서버는 해당 사용자에게 일회용 비밀번호(OTP)를 생성해 저장하고,

    SMS를 보내는 대신 데이터베이스에 직접 저장된 OTP 값을 반환한다.

    > 실제 서비스에서는 이 OTP가 문자나 이메일로 전송되겠지만, 여기선 개발 및 테스트를 위해 DB에서 직접 확인한다.

2단계

  : OTP 인증 및 JWT 토큰 발급

    앞서 받은 OTP 값을 사용자 이름과 함께 다시 /login 엔드포인트에 전달한다.

    이때 서버는 입력된 OTP가 유효한지 검증하고, 정상일 경우 JWT 토큰(Access Token) 을 발급한다.

    이 토큰은 사용자의 인증 상태를 증명해주는 역할을 하며, 추후 모든 API 요청 시 사용된다.

3단계

  : 클라이언트는 JWT 토큰을 HTTP 요청의 Authorization 헤더에 담아 비즈니스 서버의 보호된 엔드포인트를 호출할 수 있다.

 

 

 

그럼 다음 포스팅에서는 인증 서버를 직접 구현해보자.

 

 

참고 : Spring Security in Action 

반응형