비밀번호 암호화
build.gradle
비밀번호 암호화와 cors, csrf 설정 등을 위한 의존성을 추가한다.
dependencies {
// ...
implementation 'org.springframework.boot:spring-boot-starter-security'
}
SecurityConfig
config 패키지 안에 SecurityConfig 클래스를 작성한다.
securityFilterChain 메서드에서 cors, csrf, 인증 검사를 제외할 라우트를 작성한다.
비밀번호를 암호화하는 메서드 passwordEncoder를 작성한다.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.authorizeHttpRequests((authorizeRequests) ->
authorizeRequests
.requestMatchers("/users/register")
.permitAll()
);
return httpSecurity.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
UserService
비밀번호를 암호화된 비밀번호로 지정하여 DB에 저장한다.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
public void createUser(RegisterDTO registerDTO) {
UserEntity userEntity = UserEntity.toUserEntity(registerDTO);
userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword()));
userRepository.save(userEntity);
}
}
에러 일지
유효성 검사
int 자료형이랑 boolean 자료형에도 @NotBlank를 해놨었는데 유효성 검사에서 에러가 나는지 403 뱉어서 바꿔줬다.
@Data
public class RegisterDTO {
// ...
@Min(value = 12, message = "업종 번호 확인 필요")
private int sectorId;
@NotNull(message = "마케팅 동의 여부 확인 필요")
@AssertTrue
private Boolean isMarketing;
}
Boolean
isMarketing을 true로 보내든 false로 보내든 DB에 모두 0으로 들어가는 문제가 있었다. 자료형을 boolean → Boolean으로 바꾸니까 해결됐다. DTO랑 Entity 모두 수정했다.
Password
DB에 password 자료형을 VARCHAR(45)로 해놨었는데 삽입하려는 데이터가 너무 길다는 에러가 났다. 그래서 일단 200으로 바꿔주니까 해결됐다.
주저리
오늘 집에 늦게 옴 이슈로 이거밖에 못했다.
스프링 부트 실행하면 아래와 같은 메시지가 계속 뜨는데 인증 설정을 안 해줘서 그렇다고 한다. 로그인할 때 한번 해봐야겠다.
Using generated security password: 9a400946-93d3-4449-9089-6d91648ebf58
This generated password is for development use only. Your security configuration must be updated before running your application in production.
passwordEncoder은 비밀번호를 암호화할 때 새로운 salt를 생성하고, 비밀번호가 동일한지 비교할 때는 암호문에서 salt를 추출해서 비교한다고 한다. 그래서 salt를 DB에 따로 저장하지 않아도 된다고 한다.
내일은 유효성 검사랑 응답 형식에 대해 해볼 예정이다.
'웹 프로그래밍' 카테고리의 다른 글
[Spring Boot] Licruit - 로그인 (0) | 2024.09.12 |
---|---|
[Spring Boot] Licruit - 에러 처리 (1) | 2024.09.11 |
[Spring Boot] Licruit - 회원가입 (0) | 2024.09.10 |
[Spring Boot] API 생성 (0) | 2024.07.08 |
[React] 프로젝트 관리 앱 (1) | 2024.01.26 |