가입 확인 이메일 재전송

구현 로직

  • 가입 확인 이메일을 재전송할 수 있는 기능 제공
  • 너무 자주 전송 시 리소스 낭비할 수도 있는 문제 발생
  • 1시간에 한번만 인증 메일 전송할 수 있도록 제한

Get "/check-email"

  • 가입 확인 이메일을 전송한 이메일 주소를 화면에 보여줌
  • 재전송 버튼 보여주기
  • 재전송 버튼 클릭시 get "/resend-confirm-email"요청 전송

시큐리티 설정에서 check-email 을 제거해줬다. check-email 은 permitAll 이 아니라 로그인한 사용자만 접근 가능해야 한다.

인증 이메일 다시 보내기 버튼을 클릭할 시 다음과 같은 화면이 표출된다.

웹 서비스를 다운시키려는 목적으로 이메일을 계속 요청할 수 있다. 그럼 과부하가 생길 수 있다.

  public boolean canSendConfirmEmail() {
        return this.emailCheckTokenGeneratedAt.isBefore(LocalDateTime.now().minusHours(1));
    }

따라서 1시간마다 가능하도록 하게 하였다.

<div class="py-5 text-center" th:if="${error != null}">

error 메시지가 있을 때 보여주는 블럭

<div class="py-5 text-center" th:if="${error == null}">

error 메시지가 없을 때 보여주는 블럭

Get "/resend-confirm-email"

  • 인증 메일을 다시 전송할 수 있는지 확인
  • 보낼 수 있으면 전송, 첫 페이지로 리다이렉트
  • 보낼 수 없으면 에러 메시지를 모델에 담아주고 이메일 확인 페이지 다시 표출

Q. 리다이렉트를 하는 이유는?
화면 리프레쉬를 할때 마다 이메일이 재전송 되면 안된다. resend-confirm-email이 주소창에 계속 있으면 화면을 리프레쉬 할때 마다 계속 이메일을 보내게 된다. (의도치 않게) 그래서 미연에 방지하기 위해 ~! (get 요청임에도 불구하고)

SingUpForm도 마찬가지 이유 때문에 리다이렉트를 했다.

    @PostMapping("/sign-up")
    public String signUpSubmit(@Valid SignUpForm signUpForm, Errors errors) {
        if (errors.hasErrors()) {
            return "account/sign-up";
        }

        Account account = accountService.processNewAccount(signUpForm);
        accountService.login(account);
        return "redirect:/";
    }

get으로 home을 보여주는 것보다 post 한 다음에 리다이렉트 하는 것, 아무리 리프레시 하더라도 ... (?!)

어떤 요청을 처리했을 때 다시 일어나지 않았으면 좋겠다고 생각하면 리다이렉트 .. 등 적절한 요청을 생각해보자.


출처 : 인프런 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발

좋은 웹페이지 즐겨찾기