유효성 검사라는 부가적인 로직을 처리했으니
핵심 로직을 처리해준다.
@PostMapping("/join")
public String join(@Valid JoinReqDto joinReqDto, BindingResult bindingResult) {
// 회원가입 로직에서 유효성 검사 코드는 부가적인 코드!! -> AOP
if (bindingResult.hasErrors() == true) { // 하나라도 오류가 있다면 true
Map<String, String> errorMap = new HashMap<>();
for (FieldError fe : bindingResult.getFieldErrors()) {
// System.out.println(fe.getField()); // 어느 변수에서 오류가 났는지 알려줌
// System.out.println(fe.getDefaultMessage()); // 메세지 지정안해줘도 디폴트 메세지가 있음
errorMap.put(fe.getField(), fe.getDefaultMessage());
}
throw new CustomException(errorMap.toString());
}
// 핵심 로직
userService.회원가입(joinReqDto.toEntity());
return "redirect:login-form";
}
package site.metacoding.blogv3.service;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;
import site.metacoding.blogv3.domain.user.User;
import site.metacoding.blogv3.domain.user.UserRepository;
@RequiredArgsConstructor
@Service // IoC 등록
public class UserService {
// DI
private final UserRepository userRepository;
@Transactional
public void 회원가입(User user) {
userRepository.save(user);
}
}
package site.metacoding.blogv3.domain.user;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Integer> {
}
실제 브라우저에서 회원가입 요청을 해보자.
DB에 잘 들어갔다.
DB에 저장이 잘 되었다고 해서 회원가입이 끝난 게 아니다.
시큐리티는 비밀번호 1234를 받을 수 없다.
회원가입은 되지만 로그인에서 문제가 생길 것이다.
서비스에서 처리해줘야 할 일이 있다.
user가 가지고 있는 패스워드를 해시 알고리즘을 사용해 암호화된 비밀번호로 변경해줘야 한다.
이 알고리즘을 사용하려면 라이브러리가 필요한데 이미 스프링 프레임워크에 내장되어있다.
라이브러리를 IoC 컨테이너에 등록을 해야 사용이 가능하다.
리턴하는 메서드를 달고 SecurityConfig 파일에서 @Bean을 달아놓으면 IoC컨테이너에 등록된다.
아래 글을 참고하자!
2022.03.28 - [Spring/Blog-V2] - 스프링 52강. 필터(Filter)와 인터셉터(Interceptor)
비밀번호를 해시값으로 암호화하는 알고리즘의 종류가 많다.
다양한 방법으로 각각 암호화된 값은 알고리즘에 따라 결과가 다 달라진다.
이 중 BCrypt가 디폴트 알고리즘이다.
이 알고리즘으로 암호화 된 패스워드가 DB에 저장되고,
로그인을 하면 시큐리티가 인터셉터해간다.
즉, 우리가 로그인 컨트롤러를 직접 관리하지 못하는 것이다.
클라이언트가 회원 가입한 ssar, 1234로 로그인하면
값이 DB에 존재하는지 시큐리티가 확인하는데 fail이 뜬다.
DB에는 해시로 암호화된 패스워드가 저장되어 있기 때문이다.
클라이언트는 암호화 된 패스워드로 로그인하지 않는다!!
어떤 암호화 알고리즘을 사용하여 해시화 하였는지 시큐리티에게 알려줘야 한다.
이를 위해 알고리즘 방법을 IoC에 등록해야 하는 것이다.
IoC에 등록하면 시큐리티가 알아서 알아차린다.
등록된 암호화 알고리즘으로 시큐리티가 DB에 회원가입된 정보를 찾아서
존재하지 않으면 Exception을 터뜨릴 것이다.
존재한다면?
원래 DB에 데이터가 존재할 때는 JSESSIONID로 구분된 세션 영역에 보관하여
principal이라는 키 값에 User 정보를 저장해뒀었다.
시큐리티를 사용하면 JSESSIONID로 구분된 세션 영역에
스프링 시큐리티 오브젝트인 Authentication 오브젝트를 만들어
내부에 userDetail 객체를 세션에 자동으로 등록해준다.
해시로 암호화된 패스워드의 길이가 길어지기 때문에
DB에 저장되는 User 엔티티에 길이 조건을 100 정도로 바꿔주자.
다시 회원 가입하고 DB를 확인해보면 해시로 암호화된 패스워드가 저장되어있다.
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9