[SpringBoot] 이메일 인증 과정 (Redis)

애이용·2021년 6월 24일
4

springboot

목록 보기
16/20
post-thumbnail

해당 포스팅에서 이메일 전송에 대해 다루었다.
인증 코드 이메일까지 왔다고 하자.

이전 포스팅에서는 인증 코드를 따로 저장하는 것은 얘기하지 않았다.

진행하고 있는 프로젝트에서는 비밀번호 재설정 시, 이메일 인증 과정을 거치도록 하였다.
나는 Redis 를 이용해서 인증 코드를 5분동안 유효하도록 설정하겠다.

구현할 내용 정리

  1. 이메일 인증 코드 생성
  2. Redis로 유효 시간 설정하여 이메일 인증 코드 저장
  3. 요청된 인증 코드로 이메일 인증하기

Redis에 들어가는 Data

KeyValue
인증 코드이메일

✔️ Redis Setting

먼저 Redis 설정해보자
회원 인증 메일을 요청한 사용자에 한해 몇 분 동안만 유효하게 함으로써 보안적인 측면을 강화한다.

  • 의존성 추가
  implementation 'org.springframework.boot:spring-boot-starter-data-redis'
  • RedisUtil 클래스
@RequiredArgsConstructor
@Component
public class RedisUtil {

    private final StringRedisTemplate redisTemplate;

    public String getData(String key) { // key를 통해 value(데이터)를 얻는다.
        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
        return valueOperations.get(key);
    }

    public void setDataExpire(String key, String value, long duration) { 
    //  duration 동안 (key, value)를 저장한다.
        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
        Duration expireDuration = Duration.ofMillis(duration);
        valueOperations.set(key, value, expireDuration);
    }

    public void deleteData(String key) {
    // 데이터 삭제
        redisTemplate.delete(key);
    }
}

✔️ 이메일 인증 코드 생성 및 Redis 적용

  • EmailProperties 클래스
/* @ConfigurationProperties 사용하기 위해 의존성 추가해주자.

   annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

*/

@Getter
@Setter
@ConfigurationProperties(prefix = "email") // 설정 파일에서 email: 로 시작하는 properties
@Configuration
public class EmailProperties {
    private String name;
    private String link;
    private Long validTime;
}
  • EmailService 클래스
    private final JavaMailSender emailSender;
    private final RedisUtil redisUtil;
    private final EmailProperties emailProperties;
    
   public void sendEmailMessage(String email) {
        try {
            String code = createCode();
            redisUtil.setDataExpire(code, email, emailProperties.getValidTime());
            MimeMessage message = createMessage(email, code);
            emailSender.send(message);
        } catch (Exception e) {
            throw new EmailSendException();
        }
    }

✔️ 유효 시간 설정해서 Redis에 저장하는 코드

redisUtil.setDataExpire(code, email, emailProperties.getValidTime());

그 후, 이메일 전송하는 코드를 호출하였다.

✔️ 요청된 인증 코드로 이메일 인증하기

  • EmailService 클래스
    public Long getUserIdByCode(String code) {
        String email = redisUtil.getData(code); // 입력 받은 인증 코드(key)를 이용해 email(value)을 꺼낸다.
        if (email == null) { // email이 존재하지 않으면, 유효 기간 만료이거나 코드 잘못 입력
            throw new EmailCodeException();
        }
        
        User user = userValidator.checkEmailPresent(email); // 해당 email로 user를 꺼낸다.
        return user.getId();
    }

이후 과정에서는, 비밀번호 재설정을 위해 액세스 토큰을 발급하여
비밀번호 재설정 API를 호출할 때 해당 액세스 토큰을 요청 헤더로 담도록 할 수 있다.

profile
로그를 남기자 〰️

0개의 댓글