Spring/Spring ++

Spring - SMTP 네이버 이메일 인증 , redis로 인증번호 만료 구현

backend dev 2022. 10. 16.

네이버 SMTP 설정

네이버 메일에서 왼쪽 아래 환경설정
ㄱPOP3/IMAP 설정 클릭 후 다음과 같이 설정해준다.

설정을 저장해주면 아래 Pop 서버명같이 작은 정보창이 생김

 

의존성 설정

//이메일인증
implementation 'org.springframework.boot:spring-boot-starter-mail'

 

환경설정 -> MailConfig.java OR application.yml 사용

@Configuration
public class MailConfig {

    @Value("${spring.mail.password}")
    private String password;
    @Bean
    public JavaMailSender javaMailService() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost("smtp.naver.com");
        javaMailSender.setUsername("kilwogus4048@naver.com");
        javaMailSender.setPassword(password);

        javaMailSender.setPort(465);

        javaMailSender.setJavaMailProperties(getMailProperties());

        return javaMailSender;
    }

    private Properties getMailProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", "smtp");
        properties.setProperty("mail.smtp.auth", "true");
        properties.setProperty("mail.smtp.starttls.enable", "true");
        properties.setProperty("mail.debug", "true");
        properties.setProperty("mail.smtp.ssl.trust","smtp.naver.com");
        properties.setProperty("mail.smtp.ssl.enable","true");
        return properties;
    }
}

이렇게 Config 파일을 하나만들어서 프로퍼티 설정을 하던지

아니면 설정파일을 안만들고 application.yml에 환경변수 설정을 하면된다. -> 둘다 됨.

 

application.yml에 적용시

  # Naver smtp server 사용
spring:  
  mail:
    host: smtp.naver.com #smtp 서버 주소
    port: 465 # 메일 인증서버 포트
    username: xxxx #네이버 아이디
    password: xxxx #네이버 비밀번호
    properties:
      mail:
        smtp:
          starttls:
            enable: true
#            required: true
          auth: true
#          connectiontimeout: 5000
#          timeout: 5000
#          writetimeout: 5000
          ssl:
            #trust: smtp.naver.com
            enable: true #반드시 필요 -> SSL 필요로 되어있으면 

위와 같이 application.yml에 추가해주면됨. 

 

MailService.java  메일관련 메소드 파일

@Service
public class MailService {

    private final JavaMailSender javaMailSender;
    private final MailDao mailDao;

    private final RedisUtil redisUtil; //redis 관련

    @Autowired
    public MailService(JavaMailSender javaMailSender,MailDao mailDao,RedisUtil redisUtil )
    {
        this.javaMailSender = javaMailSender;
        this.mailDao = mailDao;
        this.redisUtil = redisUtil;
    }




    private MimeMessage createMessage(String code, String email) throws Exception{
        MimeMessage message = javaMailSender.createMimeMessage();

        message.addRecipients(Message.RecipientType.TO, email);
        message.setSubject("Planet 인증 번호입니다.");
        message.setText("이메일 인증코드: "+code);

        message.setFrom("환경변수로 등록한 네이버 아이디@naver.com"); //보내는사람.

        return  message;
    }

    public void sendMail(String code, String email) throws Exception{
        try{
            MimeMessage mimeMessage = createMessage(code, email);
            javaMailSender.send(mimeMessage);
        }catch (MailException mailException){
            mailException.printStackTrace();
            throw   new IllegalAccessException();
        }
    }

    public String sendCertificationMail(String email)  throws BaseException {
//        if(userProvider.checkEmail(email) == 1){
//            throw new BaseException(BaseResponseStatus.DUPLICATED_EMAIL);
//        }
        try{
            String code = UUID.randomUUID().toString().substring(0, 6); //랜덤 인증번호 uuid를 이용!
            sendMail(code,email);

            redisUtil.setDataExpire(code,email,60*5L); // {key,value} 5분동안 저장.

            return  code;
        }catch (Exception exception){
            exception.printStackTrace();
            throw   new BaseException(BaseResponseStatus.DATABASE_ERROR);
        }
    }
}

랜덤 인증코드를 만들고 

제목 내용을 정하고

메일을 보내는 일련의 과정을 MailService에 구현  ++ redisUtil은 인증번호의 만료시간을 위한것이고 뒤쪽에서 정리

(보내는 사람은 SMTP 설정을 했고 , 환경변수로 아이디와 비밀번호를 입력했던 그아이디를 적어주면된다)

 

 

MailController.java

MailService에서 정의한 메소드들을 사용할 Controller

//인증메일 발송 연습 api
    @ResponseBody
    @PostMapping("")
    public BaseResponse<String> mailAuthentication (@RequestBody PostMailreq postMailreq) throws BaseException
    {

        if(postMailreq.getEmail() == null){
            return  new BaseResponse<>(BaseResponseStatus.POST_USERS_EMPTY_EMAIL);
        }

        if(!ValidationRegex.isRegexEmail(postMailreq.getEmail())){
            return  new BaseResponse<>(BaseResponseStatus.POST_USERS_INVALID_EMAIL);
        }

        try{

            String verifyCodeId = mailService.sendCertificationMail(postMailreq.getEmail());

            return new BaseResponse<>(verifyCodeId);
        }
        catch (BaseException baseException){
            return  new BaseResponse<>(baseException.getStatus());
        }

    }

리턴으로 코드(인증번호)값을 리턴해서 확인해본다.

 

 

포스트맨 결과 , 이메일 온거 확인

포스트맨에서 인증코드를 확인가능
이메일로 잘오는걸 확인.

 

 


redis 구현 ( 인증번호 만료기간 정하기 위함)

이메일인증이나 휴대폰인증번호는 만료시간이 있기마련이다. ( 계속 어디다가 저장해놓을수도없으니)

 

redis 설치

redis -> 데이터가 키 값(key,value) 이루어진 비관계형 데이터베이스

윈도우

다음 블로그에서 따라하면된다. (마이크로소프트에서 redis 쉽게 설치하도록 제공한다고함)

 

[ Redis ] Window에 redis 설치해서 사용하기

스프링 부트의 캐싱 기능을 사용하다보니 분산 캐싱 기능도 사용해보고 싶어졌다. 분산 캐싱에 사용할 캐시 데이터 저장 공간은 여러 가지를 사용하는데, 그 중 Redis라는 것을 사용해보려고 한

pamyferret.tistory.com

압축파일 풀고 폴더내부에

압축풀면 나오는 파일들

redis-server.exe를 눌러서 redis 서버를 키고

redis-server 키면 뜨는창

redis-cli.exe를 눌르면 cmd같은창이뜨는데 거기다가 명령어 입력하면된다.

redis-cli.exe 키면 뜨는창.

환경설정같은경우에는

redis.windows.conf 라는 파일을 메모장으로 열어 수정하면 된다.

 

우분투같은 경우 설치는

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install redis-server

순서로 입력하면 되고 

 

 

redis 환경설정을 위한 conf 파일수정은 

sudo vi /etc/redis/redis.conf

실행은

redis-server 를해주고

명령어입력창은

redis-cli

 

redis 백그라운드 실행

1. daemon이용

redis-server --daemonize yes

 

redis-cli ping   -> pong이라고 뜨면 성공

 

2. using systemctl 

sudo systemctl start redis

 

출처,참고,더 자세히보기
 

[Redis] Ubuntu에 Redis 설치하기

Ubuntu에 Redis를 설치해보도록 하겠습니다 Redis 설치하기 redis를 다운받고 압축을 풀어줍니다 wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz redis-stable 폴더로 이동하여 컴파일을 합니

artiiicy.tistory.com

 

redis 정지

1. redis-cli shutdown

2. service redis stop

 

 

Ec2에서 redis를 이용하기 위한 설정

sudo vi /etc/redis/redis.conf 를 이용하여 redis 설정파일을 수정하러가서

 

bind 부분찾아서 -> 명령모드 /찾을검색어 -> 엔터     다음 단어 n 이전단어 N

127.0.0.1 을 0.0.0.0으로 수정해주면되고

 

EC2는 메모리가 작으므로 

 

maxmemory 부분을 찾아서 500MB로 수정해주면된다.

주석이 되어있을텐데 주석지우면됨

 

출처,참고 , 추가적인 설정을 알고싶다면
 

[Redis] AWS EC2에 redis-server setup 하기

이번 글에서는 AWS EC2에 외부에서 접속 가능한 redis-server를 setup 하는 과정을 정리해보겠습니다. EC2 인스턴스 생성 우선, redis-server를 설치할 EC2 인스턴스를 만듭니다. 저는 jony라는 이름의 ubuntu 18.

wookgu.tistory.com

 

 

 

redis를 설치했고 설정을 바꿔주고 , redis를 실행했으므로

spring에서 이용해보자

 

0.build.gradle에서 의존성추가

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

 

1. application.yml에서 환경변수 설정

spring:
    redis: # redis 설정
      host: 127.0.0.1 # 호스트는 로컬
      port: 6379

port는 conf파일안에서 수정가능하다.

 

 

 

2. RedisConfig

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }
}

https://jeong-pro.tistory.com/175

3. RedisUtil

@Component
@RequiredArgsConstructor
public class RedisUtil {

    private final StringRedisTemplate stringRedisTemplate;


    public String getData(String key) {
        ValueOperations<String,String> valueOperations = stringRedisTemplate.opsForValue();
        return valueOperations.get(key);
    }


    public void setData(String key, String value) {
        ValueOperations<String,String> valueOperations = stringRedisTemplate.opsForValue();
        valueOperations.set(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);
    }

}

 

아까 MailService 윗쪽 부분

아까 Mailservice에서 JavaMailSender는 메일을 보낼때 필요한 부분이고

RedisUtil은 Redis 데이터베이스를 사용하기 위해 필요한 부분이다.

 

    public String sendCertificationMail(String email)  throws BaseException {
        try{
            String code = UUID.randomUUID().toString().substring(0, 6); //랜덤 인증번호 uuid를 이용!
            sendMail(code,email);

            redisUtil.setDataExpire(code,email,60*5L); // {key,value} 5분동안 저장.

            return  code;
        }catch (Exception exception){
            exception.printStackTrace();
            throw   new BaseException(BaseResponseStatus.DATABASE_ERROR);
        }
    }
}

MailService에서 sendCertificationMail 메소드 안에 

redisUtil.setDataExpire(code,email,60*5L); // {key,value} 5분동안 저장.

이 있는데 

redis 데이터베이스에 code를 key값으로 email을 value값으로 가지는 데이터를 60*5L(5분)동안 저장하라는 뜻이다.

 

실행결과

메일보내면 인증번호가 redis 데이터베이스에 저장되는걸 확인해보자.

 

redis-cli를 켜서 저장된걸 확인해보니 잘저장됬다.

redis-cli에서 명령어

keys *  -> 전체 키값 조회

 

 

5분뒤

다시 키값들을 검색해보니 지워져있다.

 

 

 

 

 

 

 

 

 

 

 

다른 redis-cli 명령어 참고 출처 추가공부
 

[SpringBoot] Redis+SMTP 인증메일 구현

Redis를 springboot와 연동하여 google SMTP를 이용한 회원 비밀번호 재설정 인증메일을 구현해보았습니다.MacUbuntu 20.04 TS설치가 워낙 간단해서 그냥 다운로드했지만, 도커를 사용하는 방법도 있습니다.

velog.io

 


출처,참고,더알아보기

 

 

[SpringBoot] SMTP 이메일 인증 (네이버)

프로젝트를 하던 도중 회원가입 과정에서 이메일 인증이 필요했다. 처음에는 SMTP 메일 전송을 구글로 하려고 하였다. 이를 위해서는 보안 수준이 낮은 앱의 액세스를 허용해주어야 했다. 따라서

velog.io

 

 

Spring를 이용한 이메일 인증(feat. 네이버,구글)

프로젝트에서 일반 회원가입에서 회원의 인증을 위해서 이메일 인증 기능을 넣게 되었다. 기능을 구현하면서 진행했던 절차들을 정리해보도록 하겠다.google SMTP 서버, Naver SMTP 서버등 다양한 서

velog.io

 

 

 

[Spring] 이메일 인증 번호 전송, 유효 시간 (Gmail SMTP Server, Redis)

많이 부족해서 이곳저곳 참고하면서 구현해보았습니다.. 더 좋은 방법이나 조언 및 참고 링크 구합니다..! ○ 개발 환경 - intellij IDEA 2020.03 - spring boot 2.4.8 - project SDK : java 11 - gradle 6.9 - h2 database -

dmaolon00.tistory.com

 

댓글