Spring - SMTP 네이버 이메일 인증 , redis로 인증번호 만료 구현
네이버 SMTP 설정
설정을 저장해주면 아래 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-cli.exe를 눌르면 cmd같은창이뜨는데 거기다가 명령어 입력하면된다.
환경설정같은경우에는
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에서 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에서 명령어
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