해당 포스팅에서 이메일 전송에 대해 다루었다.
인증 코드 이메일까지 왔다고 하자.
이전 포스팅에서는 인증 코드를 따로 저장하는 것은 얘기하지 않았다.
진행하고 있는 프로젝트에서는 비밀번호 재설정 시, 이메일 인증 과정을 거치도록 하였다.
나는 Redis 를 이용해서 인증 코드를 5분동안 유효하도록 설정하겠다.
Redis에 들어가는 Data
Key | Value |
---|---|
인증 코드 | 이메일 |
먼저 Redis 설정해보자
회원 인증 메일을 요청한 사용자에 한해 몇 분 동안만 유효하게 함으로써 보안적인 측면을 강화한다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
@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);
}
}
/* @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;
}
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());
그 후, 이메일 전송하는 코드를 호출하였다.
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를 호출할 때 해당 액세스 토큰을 요청 헤더로 담도록 할 수 있다.