[SpringBoot] email Auth: 이메일 인증 구현하기

이번엔 회원가입, 이메일 재설정,비밀번호 재설정 등 많은 서비스 구현에서 사용되는 emailAuth 를 구현해보자 !


1. '이메일 인증' 버튼을 누르면 Controller 에서 작동될 'postEmail' 메서드 만들기

@RequestMapping(value = "email",
        method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String postEmail(UserEntity user, EmailAuthEntity emailAuth)
        throws NoSuchAlgorithmException, MessagingException {
    Enum<?> result = this.memberService.sendEmailAuth(user, emailAuth);
    JSONObject responseObject = new JSONObject();
    responseObject.put("result", result.name().toLowerCase());
    if (result == CommonResult.SUCCESS) {
        responseObject.put("salt", emailAuth.getSalt());
    }
    return responseObject.toString();
}

2. <1>에서 사용되는 sendEmailAuth Service 메서드 작성하기

2-1.  입력받은 email을 통해 이미 DB에 있는 user인지 검사

2-2. 중복된 이메일이 아닐경우, 인증 코드와 인증 Salt 생성

>> salt 를 생성하는 이유?

해시하려는 원본값에 추가하는 값으로 , 

2-3. 생성일시, 유효시간 생성

2-4. 필요한 정보 authEmail에 저장 후 insert

2-5. 타임리프를 이용해 보낼 메일의 정보를 저장한다.

 

@Transactional
public Enum<? extends IResult> sendEmailAuth(UserEntity user, EmailAuthEntity emailAuth) throws NoSuchAlgorithmException, MessagingException {
    //1 0
    //2 0
    //3 X
    UserEntity existingUser = this.memberMapper.selectUserByEmail((user.getEmail()));
    if (existingUser != null) {
        return SendEmailAuthResult.EMAIL_DUPLICATED;
    }
    String authCode = RandomStringUtils.randomNumeric(6);
    String authSalt = String.format("%s%s%f%f",
            user.getEmail(),
            authCode,
            Math.random(),
            Math.random());
    StringBuilder aythSaltHashBuilder = new StringBuilder();
    MessageDigest md = MessageDigest.getInstance("SHA-512");
    md.update(authSalt.getBytes(StandardCharsets.UTF_8));
    for (byte hashByte : md.digest()) {
        aythSaltHashBuilder.append(String.format("%02x", hashByte));
    }
    authSalt = aythSaltHashBuilder.toString();

    Date createOn = new Date();
    Date expiresOn = DateUtils.addMinutes(createOn, 5);

    emailAuth.setEmail(user.getEmail());
    emailAuth.setCode(authCode);
    emailAuth.setSalt(authSalt);
    emailAuth.setCreatedOn(createOn);
    emailAuth.setExpiresOn(expiresOn);
    emailAuth.setExpired(false);
    
    if (this.memberMapper.insertEmailAuth(emailAuth) == 0) {
        return CommonResult.FAILURE;
    }

    Context context = new Context(); // 타임리프
    context.setVariable("code", emailAuth.getCode());
    String text = this.templateEngine.process("member/registerEmailAuth", context);
    MimeMessage mail = this.mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mail, "UTF-8");
    helper.setFrom("보내는 사람 이메일");
    helper.setTo(user.getEmail());//받는사람
    helper.setSubject("메일제목");
    helper.setText(text, true);
    this.mailSender.send(mail);
    return CommonResult.SUCCESS;
}