이메일로 인증 과정(SMTP,Redis)

woonie·2022년 8월 30일
1

지난 프로젝트를 진행하면서 Redis를 처음 써봤다. 실시간 채팅을 구현하여 채팅 내역을 저장하려고 했지만 서비스 특성상 채팅 내역은 DB에 저장하고 실시간 채팅 인원수 카운팅 하는데 사용했다.
회원가입 시 이메일을 통해 인증번호를 발송하고 해당 인증 번호를 Redis에 저장하여 인증 과정을 구현했다.

Redis를 이전에 정리했었기에 간단하게 설명하자면 인메모리 데이터 구조로 컴퓨터의 메인 메모리 RAM에 데이터를 올려 사용하는 방법이다.
메모리에 데이터를 올리는 이유는 속도 때문이다. 저장공간에서 데이터를 가져오는 속도와 RAM에 올려진 데이터를 가져오는 속도가 수백배 이상 빠르다.
그러하기에 Redis는 빠른 속도가 장점이다.

1. Redis설치

  • 이번에는 배포 서버에 설치하지 않고 간단하게 로컬에 설치했다.
    아래 블로그를 참고하면 간단하게 설치 가능하다.
    참고 : https://jsikim1.tistory.com/192

2. 의존성 추가 및 properties 설정

    //Redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
  • properties
#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

3. RedisUtill

@RequiredArgsConstructor
@Service
public class RedisUtill {
    private final StringRedisTemplate stringRedisTemplate;

    // key를 통해 value 리턴
    public String getData(String key) {
        ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
        return valueOperations.get(key);
    }

    // 유효 시간 동안(key, value)저장
    public void setDataExpire(String key, String value, long duration) {
        ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
        Duration expireDuration = Duration.ofSeconds(duration);
        valueOperations.set(key, value, expireDuration);
    }

    public void deleteData(String key) {
        stringRedisTemplate.delete(key);
    }
}

Redis
○ getData : key 입력 시, value 리턴 / value 입력 시, key 리턴
○ setDataExpire : {key, value}가 특정 유효 시간 동안만 저장되도록 함
○ deleteData : Data 삭제

4. EmailService

  • 메일 발송 메서드에서 Redis에 저장하는 코드만 추가했다.
    public String sendSimpleMessage(String to) throws Exception {
        MimeMessage message = createMessage(to);
        try {
            redisUtil.setDataExpire(ePw, to, 60 * 1L); // 유효시간 1분
            javaMailSender.send(message); // 메일 발송
        } catch (MailException es) {
            es.printStackTrace();
            throw new IllegalArgumentException();
        }
        return ePw; // 메일로 보냈던 인증 코드를 서버로 리턴
    }
  • 유효 시간 설정하여 Redis에 저장하는 코드

    redisUtil.setDataExpire(ePw, to, 60 * 1L); // 유효시간 1분

  • 메일로 발송된 인증 번호로 유효한 인증 번호인지 확인

    public String verifyEmail(String key) throws ChangeSetPersister.NotFoundException {
        String memberEmail = redisUtil.getData(key);
        if (memberEmail == null) {
            throw new ChangeSetPersister.NotFoundException();
        }
        redisUtil.deleteData(key);
        return ePw;
    }

5. 마무리

  • 해당 인증번호가 담긴 메일이 발송된다(인증번호 : 938657)

  • Redis에 해당 key값으로 저장되어 있다.

  • 유효 시간인 1분 후 또는 인증 후 해당 key값은 삭제된다.

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글