Step-by-Step
[Spring] 7. 비밀번호 인코딩 & SMTP로 임시 비밀번호 전송 본문
보통 사용자가 로그인하기 전 비밀번호를 찾을 때,
아이디를 직접 알려주는 아이디 찾기와 달리, 임시 비밀번호를 생성해서 전송해준다!
구글, 네이버, 다음 등등.. SMTP를 제공해주는 곳은 많이 있다!
처음에는 네이버로 사용했다가, 코드가 이상한지 뭐가 안맞는지 실행이 잘 안돼서 구글로 결정!
SMTP 사용
[build.gradle] 의존성 추가
implementation 'com.sun.mail:javax.mail:1.6.2'
implementation 'org.springframework.boot:spring-boot-starter-mail:2.6.5'
https://mvnrepository.com/artifact/com.sun.mail/javax.mail
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail
[application.properties]
# Mail -Google-
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=내메일주소@gmail.com
spring.mail.password=발급된 비밀번호
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
구글 SMTP 사용법 쳐서 그대로 따라했다!
[코드]
//임시 비밀번호 발급
String tempPW = getRandomPassword(10);
String encodedPW = passwordEncoder.encode(tempPW);
//이메일 전송
String to = userDTO.getEmail();
String from = "EnergySolution_TempPW_manager";
String subject = "temporary password";
StringBuilder body = new StringBuilder();
body.append("<html> <body><h1>임시 비밀번호는 다음과 같습니다. </h1> <div>");
body.append(tempPW);
body.append("</div> </body></html>");
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true, "UTF-8");
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(body.toString(), true);
javaMailSender.send(message);
- from, to, subject, text에 담을 내용을 지정한 후, javaMailSender를 통해 보내면 된다.
- 주황색 부분은 SMTP 설정한 메일, 초록색 부분은 위의 코드에서 setTo()안에 들어있는 메일주소값이다
( 확인해보기 위해 내 naver 계정을 이용하였다.ㅋㅋ)
임시 비밀번호 발급
임시 비밀번호 만드는 것은 인터넷에도 많이 나와 있어서 여러 블로그를 참조했는데,
코드는 조금 길지만 가장 알아보기 쉬운 코드를 선택하여 가져왔다!
//임시 비밀번호 발급
public String getRandomPassword(int size) {
char[] charSet = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '!', '@', '#', '$', '%', '^', '&' };
StringBuffer sb = new StringBuffer();
SecureRandom sr = new SecureRandom();
sr.setSeed(new Date().getTime());
int idx = 0;
int len = charSet.length;
for (int i=0; i<size; i++) {
// idx = (int) (len * Math.random());
idx = sr.nextInt(len);
// 강력한 난수를 발생시키기 위해 SecureRandom을 사용
sb.append(charSet[idx]);
}
return sb.toString();
}
size만 지정해주면 끝!
비밀번호 인코딩
[build.gradle]
implementation 'org.springframework.boot:spring-boot-starter-security'
Spring security에 있는 인터페이스 객체 PasswordEncoder를 사용할 것이다https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security
[코드]
@Autowired
private PasswordEncoder passwordEncoder;
Service의 필드값으로 PasswordEncoder를 미리 선언해놓고
String encodedPW = passwordEncoder.encode(비밀번호);
encode() 메소드를 이용하여 인코딩된 값을 String으로 받아 사용하면 된다
passwordEncoder.matches(입력받은 PW, DB에 있는 인코딩된 PW)
사용자가 로그인 하기 위해 ID와 비밀번호를 전달해주면, 비밀번호를 이런식으로 DB에서 꺼내와 확인하였다
★ 인자 넣는 순서 !!! ===> (인코딩X비밀번호 , 인코딩O비밀번호)
[참조]
https://youngjinmo.github.io/2021/05/passwordencoder/
'프로젝트 > Eggo (Mobile App)' 카테고리의 다른 글
[Spring] 9. 안드로이드 통신 - HttpUrlConnection (0) | 2022.05.21 |
---|---|
[Spring] 8. 날씨 API 받아오기 (0) | 2022.05.19 |
[Spring] 6. 응답표준 (1) (0) | 2022.04.29 |
[Spring] 5. Mapper.java와 Mapper.xml 작성 (0) | 2022.04.26 |
[Spring] 4. Service 작성 (0) | 2022.04.15 |