Step-by-Step

[Spring] 7. 비밀번호 인코딩 & SMTP로 임시 비밀번호 전송 본문

프로젝트/Eggo (Mobile App)

[Spring] 7. 비밀번호 인코딩 & SMTP로 임시 비밀번호 전송

희주(KHJ) 2022. 5. 18. 22:27

보통 사용자가 로그인하기 전 비밀번호를 찾을 때,

아이디를 직접 알려주는 아이디 찾기와 달리, 임시 비밀번호를 생성해서 전송해준다!

 

구글, 네이버, 다음 등등.. 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

 

Maven Repository: com.sun.mail » javax.mail

 

mvnrepository.com

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail

 

 

Maven Repository: org.springframework.boot » spring-boot-starter-mail » 2.6.7

Starter for using Java Mail and Spring Framework's email sending support org.springframework.boot spring-boot-starter-mail 2.6.7 // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail implementation group: 'org.springframew

mvnrepository.com

 

 

 

[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

 

Maven Repository: org.springframework.boot » spring-boot-starter-security

Starter for using Spring Security VersionVulnerabilitiesRepositoryUsagesDate2.6.x2.6.7Central46Apr, 20222.6.6Central84Mar, 20222.6.5Central19Mar, 20222.6.4Central57Feb, 20222.6.3Central192Jan, 20222.6.2Central64Dec, 20212.6.1Central52Nov, 20212.6.0Central1

mvnrepository.com

 

[코드]

    @Autowired
    private PasswordEncoder passwordEncoder;

Service의 필드값으로 PasswordEncoder를 미리 선언해놓고

String encodedPW = passwordEncoder.encode(비밀번호);

encode() 메소드를 이용하여 인코딩된 값을 String으로 받아 사용하면 된다

passwordEncoder.matches(입력받은 PW, DB에 있는 인코딩된 PW)

사용자가 로그인 하기 위해 ID와 비밀번호를 전달해주면, 비밀번호를 이런식으로 DB에서 꺼내와 확인하였다

★ 인자 넣는 순서 !!!  ===> (인코딩X비밀번호 , 인코딩O비밀번호) 

 

 

 

[참조]

https://gangzzang.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81Spring-MainlSender-JavaMailSender-%EB%A9%94%EC%9D%BC-%EB%B0%9C%EC%86%A1

https://youngjinmo.github.io/2021/05/passwordencoder/

 

Comments