현의 개발 블로그

비밀번호 재설정 API 설계 본문

대외활동/한이음

비밀번호 재설정 API 설계

hyun2371 2023. 7. 17. 19:54

임시 비밀번호를 생성하고 요청 유저 이메일로 전송하는 API를 설계해보자.

 

설정

1. Gmail SMPT  Server설정

구글 계정만 있으면 무료로 이메일 발송이 가능하다.

 

스프링에서 Gmail SMPT서버를 사용하기 위해 앱 비밀번호가 필요하다.

해당 비밀번호는 구글 보안(https://myaccount.google.com/security)에서 생성 가능하다.

 

앱 비밀 번호를 생성하려면 먼저 2단계 인증을 사용해야 한다.

 

그 후 앱 비밀번호를 생성한다.

생성된 비밀번호는 최초 한 번만 열람이 가능하니 미리 복사해두자.

 

2. 의존성 추가

build.gradle에 아래 코드를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-mail'

 

3. application.yml 설정

계정 정보이므로 프로젝트를 github에 올릴 경우 gitignore에 추가하자.

spring:
  mail:
    host: smtp.gmail.com
    port: 465
    username: {구글 이메일}
    password: {구글 앱 비밀번호}
    properties:
      mail.smtp.auth: true
      mail.smtp.ssl.enable: true

 

 

 

API 설계

서비스 로직

requestDto에는 유저 이메일과 유저 아이디가 담겨 있다.

 

유저 아이디로 유저를 조회하고 없으면 특정 응답을 반환한다.

유저 이메일이 DB와 일치하는지 확인하여 아닐 경우 특정 응답을 반환한다.

 

임시 비밀번호를 만들고 암호화하여 DB에 업데이트한다.

그 후 임시 비밀번호를 유저 이메일로 전송한다.

public BaseResponse<String> mailTempPassword(UserReq.MailTmpPw request){
        User user = userRepository.findById(request.getUserId()).orElse(null);
        if (user==null){
            return new BaseResponse<>(NOT_EXIST_USER_ID);
        }
        if (!request.getEmail().equals(user.getEmail())) {
            return new BaseResponse<>(INCORRECT_EMAIL);
        }

        String tmpPassword = getTmpPassword();
        user.changeUserPw(passwordEncoder.encode(tmpPassword));

        sendTmpPwd(user.getEmail(), tmpPassword);

        return new BaseResponse<>(SUCCESS);
    }

아래는 서비스 로직에 작성했던 함수이다.

 

임시 비밀번호 설정

문자 배열에서 랜덤으로 10개를 뽑아 비밀번호를 생성한 후 반환한다.

public String getTmpPassword() {
        char[] charSet = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
                'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

        String pwd = "";

        /* 문자 배열 길이의 값을 랜덤으로 10개를 뽑아 조합 */
        int idx = 0;
        for(int i = 0; i < 10; i++){
            idx = (int) (charSet.length * Math.random());
            pwd += charSet[idx];
        }
        return pwd;
    }

 

이메일로 전송

application.yml에서 구글 계정 이메일 정보를 가져온다.

@Value를 import할 때 lombok을 import 하지 않도록 주의하자.

import org.springframework.beans.factory.annotation.Value;

@Value("${spring.mail.username}")
private String from;

 

유저에게 임시 비밀번호를 메일로 보낸다.

private void sendTmpPwd(String email, String tmpPassword) {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setTo(email);
    message.setFrom(from);
    message.setSubject("[북다락] 임시 비밀번호가 발급되었습니다.");
    message.setText("임시 비밀번호는 "+ tmpPassword + "입니다.");

    javaMailSender.send(message);
}

 

 

결과 확인

유저 이메일과 아이디를 넣어 비밀번호 변경 API를 호출한다.

 

해당 이메일로 임시 비밀번호가 전송된다.

 

 

임시 비밀번호를 입력해 비밀번호 변경이 가능하다.

 

 


Reference

 

[SpringBoot] 이메일 전송 ( JavaMailSender, MimeMessageHelper )

이번 글에서는 MailSender 인터페이스를 상속받은 JavaMailSender를 사용하여 이메일 전송 시스템을 구현해보도록 하겠습니다.전체 코드는 깃헙을 참고하시길 바랍니다. 개발환경IntelliJ 2019.02Java 11Sprin

victorydntmd.tistory.com

 

Comments