비버놀로지

[Spring JPA] 1-8. 회원 가입 : 패스워드 인코더 본문

LANGUAGE STUDY/Spring

[Spring JPA] 1-8. 회원 가입 : 패스워드 인코더

KUNDUZ 2021. 4. 30. 21:43
728x90

해싱 알고리즘(bcrypt)와 솔트(salt)를 활용해서 비밀번호를 인코더해줘야 한다.

 

비밀번호를 암호화 하기 위해서 AccoutService에서 입력된 비밀번호를 해싱 알고리즘을 통해서 암호화 처리를 해주어야 한다.

 

	public Account saveNewAccount(SignUpForm signUpForm) {
		Account account = Account.builder()
				.email(signUpForm.getEmail())
				.nickname(signUpForm.getNickname())
				.password(passwordEncoder.encode(signUpForm.getPassword()))
				.studyCreatedByWeb(true).studyEnrollmentResultByWeb(true).studyUpdatedByWeb(true).build();
		Account newAccount = accountRepository.save(account);

		newAccount.generateEmailCheckToken();
		return newAccount;
	}

 

위의 코드와 같이 입력된 패스퉈드를 passwordEncoder.encode()를 통해서 SHA.256방식으로 암호화 처리를 해준다.

 

package com.studyolle.account.service;

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import com.studyolle.repository.AccountRepository;
import com.studyolle.repository.dto.Account;
import com.studyolle.repository.dto.SignUpForm;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class AccountService {
	

	private final AccountRepository accountRepository;
	private final JavaMailSender javaMailSender;
	private final PasswordEncoder passwordEncoder;
	
	

	public void processNewAccount(SignUpForm signUpForm) {
		Account newAccount = saveNewAccount(signUpForm);
		sendSignUpConfirmEmail(newAccount);
	}
	
	public Account saveNewAccount(SignUpForm signUpForm) {
		Account account = Account.builder()
				.email(signUpForm.getEmail())
				.nickname(signUpForm.getNickname())
				.password(passwordEncoder.encode(signUpForm.getPassword()))
				.studyCreatedByWeb(true).studyEnrollmentResultByWeb(true).studyUpdatedByWeb(true).build();
		Account newAccount = accountRepository.save(account);

		newAccount.generateEmailCheckToken();
		return newAccount;
	}

	public void sendSignUpConfirmEmail(Account newAccount) {
		SimpleMailMessage mailMessage = new SimpleMailMessage();
		mailMessage.setSubject("스터디올래, 회원 가입 인증");
		mailMessage.setText(
				"/check-email-tocken?token=" + newAccount.getEmailCheckToken() + "&email=" + newAccount.getEmail());
		javaMailSender.send(mailMessage);
	}
}

 

위의 코드는 패스워드 암호화를 추가한 AccountService 전체 코드이다.

 

그리고 암호화를 사용하기 위해 config 안에 AppConfig를 생성해 준다.

 

package com.studyolle.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class AppConfig {

	@Bean
	public PasswordEncoder passwordEncoder() {
		return PasswordEncoderFactories.createDelegatingPasswordEncoder();
	}
}

 

위와 같이 작성해 주면 비밀번호 암호화를 사용할 수 있다.

 

그렇게 작성한 코드를 테스트 하기 위해 AccountControllerTest에 몇가지 추가를 통해 확인을 해준다.

 

	@DisplayName("회원 가입 처리 - 입력값 정상")
	@Test
	void signUpSubmit_with_wrong_input() throws Exception {
		mockMvc.perform(post("/sign-up").param("nickname", "keesun").param("email", "keesun@email.com")
				.param("password", "12345678").with(csrf()))

				.andExpect(status().isOk()).andExpect(view().name("account/sign-up"));
		
		Account account = accountRepository.findByEmail("keesun@email.com");
		assertNotNull(account);
		assertNotEquals(account.getPassword(), "12345678");
		assertTrue(accountRepository.existsByEmail("keesun@email.com"));
		then(javaMailsender).should().send(any(SimpleMailMessage.class));

	}

 

기존에 작성했던 회원 가입 처리에서 입력된 비밀번호를 암호화 한뒤, 기존의 비밀번호를 넣어서 암호화된 값과 일치하는지 확인해 주는 코드를 추가했다.

 

위의 코드를 실행해서 에러가 나지 않는다면 암호화가 제대로 된것을 의미한다.

 

 

 

728x90
Comments