MSA-8. Google SMTP를 활용한 이메일 인증 단계 구현
Google STMP를 이용하여 구현하였다.
member/signup 엔드포인트로 회원가입 요청을 보내면 인증 상태 false, 일반 회원 ROLE_USER 로 가입이 된다. 이후 가입 당시 작성한 이메일로 가입 링크를 보내고, 해당 링크를 접속하면 인증 상태를 true로 값을 변경한다. 발급된 토큰은 레디스에 저장하고 24시간 뒤 or 사용자의 상태가 true로 변경되었을 때 삭제한다.
#google mail
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=
spring.mail.password=
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true
여기서 username에는 발신 이메일을, password에는 앱 인증 비밀번호를 Google 설정에서 생성해 작성한다.
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '3.0.5'
implementation 'org.springframework.boot:spring-boot-starter-mail'
종속성을 주입하고…
@Service
public class EmailService {
@Autowired
private JavaMailSender mailSender;
public void sendEmail(String to, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
mailSender.send(message);
}
}
이메일 서비스 클래스를 작성한다.
private void sendVerificationEmail(MemberEntity member) {
String token = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(token, member.getEmail(), 24, TimeUnit.HOURS);
String url = "http://localhost:8080/member/verify?token=" + token;
emailService.sendEmail(member.getEmail(), "Email Verification", "Click the link to verify your email: " + url);
}
그리고 회원 가입 완료 후 이메일을 발송하는 메서드를 작성한다. param에는 토큰을 생성해 URL에 추가하여 보낸다. 추가로, SecurityConfig에 verify** 링크의 permit을 all로 설정해 준다.
public void completeSignup(String token) {
String email = (String) redisTemplate.opsForValue().get(token);
if (email == null) {
throw new IllegalArgumentException("Invalid or expired verification token");
}
MemberEntity member = jpaMemberRepository.findByEmail(email)
.orElseThrow(() -> new IllegalArgumentException("User not found"));
member.setEnabled(true);
jpaMemberRepository.save(member);
redisTemplate.delete(token);
}
해당 링크를 클릭하면 GET mapping이 되어있는 /verify 엔드포인트에 위의 메소드가 실행되어 회원 가입이 최종적으로 완료된다.
이메일이 발송되고, 해당 링크를 클릭하면 인증된 것을 확인할 수 있다.
Comments