본문 바로가기

Spring/Redis

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

728x90

지난 프로젝트를 진행하면서 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)
![](https://velog.velcdn.com/images/kyungwoon/post/b5301d21-f976-401e-91cb-4388f730f40d/image.png)

- Redis에 해당 key값으로 저장되어 있다.
![](https://velog.velcdn.com/images/kyungwoon/post/e87fc058-70de-41c2-9bce-1121ad77c6f0/image.png)

- 유효 시간인 1분 후 또는 인증 후 해당 key값은 삭제된다.
![](https://velog.velcdn.com/images/kyungwoon/post/8cd006d7-3a83-4714-b31a-cf79858774e9/image.png)

'Spring > Redis' 카테고리의 다른 글

Redis 백업 및 복구(RDB, AOF)  (0) 2024.04.18
채팅방 인원수 카운팅 오류(Redis)  (0) 2024.04.17
Embedded Redis 설정  (0) 2024.04.16
Redis(레디스)  (0) 2024.04.16