본문 바로가기

Spring

Spring Boot 3.4에서 One-Time Token 로그인 구현하기 – 비밀번호 없이 안전한 인증 방식!

728x90
반응형

🔥 비밀번호 없이 로그인한다고? 정말 가능할까?

웹사이트에서 로그인할 때마다 비밀번호를 입력하는 것이 번거롭다고 느낀 적 있나요? 혹은 사용자가 비밀번호를 자주 잊어버려 고객 지원 요청이 많아진 경험이 있나요?

최근 One-Time Token(OTT) 로그인 방식이 주목받고 있습니다. 이는 비밀번호 없이 이메일, SMS 등을 통해 전송된 일회용 토큰으로 인증하는 방식으로, 특히 사용자가 사이트를 자주 방문하지 않는 경우 유용합니다.

이번 블로그에서는 Spring Boot 3.4 및 Spring Security 6.4에서 새롭게 지원하는 OTT 로그인 기능을 소개하고, 이를 활용하여 보안성과 편의성을 동시에 잡을 수 있는 방법을 알아보겠습니다.

반응형

📌 1. One-Time Token(OTT) 로그인 방식이란?

🔑 기존 로그인 방식 vs. OTT 로그인 방식

일반적인 로그인 방식에서는 사용자가 ID와 비밀번호를 입력하여 인증합니다. 하지만 사용자가 비밀번호를 잊어버리는 경우가 많고, 이를 재설정하는 과정이 번거롭습니다.

OTT 로그인 방식은 이런 문제를 해결하기 위한 대안으로 등장했습니다.

OTT 로그인 흐름

  1. 사용자는 이메일 주소 또는 전화번호를 입력합니다.
  2. 시스템은 일회용 토큰(OTP, 인증 링크 등)을 생성하여 사용자에게 전달합니다.
  3. 사용자는 해당 토큰을 입력하거나, 링크를 클릭하여 로그인합니다.
  4. 시스템은 토큰을 검증한 후 사용자를 인증합니다.

💡 OTT 로그인 방식이 적합한 경우

  • 사용자가 비밀번호를 자주 잊어버리는 경우
  • 커뮤니티 사이트, 이벤트 페이지, 문서 서명 서비스 등 비정기적으로 접속하는 서비스
  • 비밀번호 관리 없이 보안을 유지하고 싶은 서비스

🚀 2. OTT 로그인 방식의 장점과 단점

OTT 로그인 방식의 장점

  • 비밀번호 관리 불필요 → 사용자는 비밀번호를 기억할 필요가 없음
  • 사용자 경험(UX) 향상 → 로그인 과정이 단순하고 직관적
  • 보안성 강화 → 비밀번호 탈취 위험 없음

OTT 로그인 방식의 단점

  • 1단계 인증(SFA) 방식 → 추가 보안이 필요할 수도 있음
  • Man-in-the-Middle(중간자 공격) 위험 → 보안성이 낮은 네트워크 환경에서는 취약할 수 있음

👉 대안: OTT를 사용할 때는 이메일, SMS뿐만 아니라 추가적인 2단계 인증(MFA)을 고려하는 것이 좋습니다.


🛠 3. Spring Boot 3.4에서 OTT 로그인 구현하기

📌 1) 필수 Maven 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>3.4.1</version>
</dependency>

Spring Boot 3.4와 Spring Security 6.4를 사용해야 OTT 기능을 기본적으로 활용할 수 있습니다.


📌 2) Spring Security 설정

OTT 로그인을 활성화하려면 SecurityFilterChain을 설정해야 합니다.

@Bean
SecurityFilterChain ottSecurityFilterChain(HttpSecurity http) throws Exception {
    return http
      .authorizeHttpRequests(ht -> ht.anyRequest().authenticated()) // 모든 요청을 인증 요구
      .formLogin(withDefaults()) // 기본 로그인 폼 활성화
      .oneTimeTokenLogin(withDefaults()) // OTT 로그인 활성화
      .build();
}

🔹 oneTimeTokenLogin(withDefaults()) → OTT 로그인을 활성화하는 핵심 설정
🔹 formLogin() 추가 → 기본 폼 로그인을 활성화하지 않으면 Basic Auth로 설정됨


📤 4. OTT 토큰을 사용자에게 전달하는 방법

Spring Security에서 OTT 토큰을 생성해 주지만, 토큰을 사용자에게 전달하는 기능은 개발자가 직접 구현해야 합니다.

📌 1) OneTimeTokenGenerationSuccessHandler 인터페이스 활용

아래 코드를 통해 OTT 토큰을 이메일 또는 SMS로 전송할 수 있습니다.

public class OttLoginLinkSuccessHandler implements OneTimeTokenGenerationSuccessHandler {
    private final OttSenderService senderService;
    private final OneTimeTokenGenerationSuccessHandler redirectHandler = 
        new RedirectOneTimeTokenGenerationSuccessHandler("/login/ott");

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
      OneTimeToken oneTimeToken) throws IOException, ServletException {
        senderService.sendTokenToUser(
            oneTimeToken.getUsername(),
            oneTimeToken.getTokenValue(),
            oneTimeToken.getExpiresAt()
        );
        redirectHandler.handle(request, response, oneTimeToken);
    }
}

🔹 OTT 토큰이 생성되면 handle() 메서드를 통해 사용자에게 전송
🔹 senderService.sendTokenToUser() → 이메일/SMS 발송 로직 구현 가능


🧪 5. OTT 로그인 테스트하기

📌 1) 수동 테스트 (브라우저에서 확인)

  1. mvn spring-boot:run으로 서버 실행
  2. http://localhost:8080 접속 → 로그인 페이지 확인
  3. 이메일 입력 후 "Send Token" 버튼 클릭
  4. 로그에 표시된 토큰을 복사하여 입력

📌 2) Jsoup을 활용한 자동화 테스트

@Test
void whenLoginWithOtt_thenSuccess() throws Exception {
    var optToken = this.ottSenderService.getLastTokenForUser("user");
    assertTrue(optToken.isPresent());

    var homePage = conn.newRequest(baseUrl + tokenSubmitAction)
      .data("token", optToken.get())
      .data("_csrf", csrfToken)
      .post();

    var username = requireNonNull(homePage.selectFirst("span#current-username")).text();
    assertEquals("user", username);
}

🔹 Jsoup을 활용하여 OTT 로그인 프로세스를 자동화 테스트


728x90

OTT 로그인 방식은 비밀번호 없이 간편한 로그인 경험을 제공하며, Spring Boot 3.4부터 기본 지원됩니다.
✅ Spring Security 6.4에서 간단한 설정만으로 OTT 기능을 활성화할 수 있으며, 사용자 경험(UX)을 개선할 수 있습니다.
✅ 하지만 단순한 1단계 인증 방식이라 보안성을 강화할 필요가 있습니다. OTP, 2단계 인증(MFA) 등을 함께 고려하는 것이 좋습니다.

🚀 이제 직접 Spring Boot에서 OTT 로그인을 적용해 보세요! 😃

https://www.baeldung.com/spring-security-one-time-token-login

728x90
반응형