Loading...

Spring/Tistory / / 2022. 4. 11. 17:39

블로그-V3. 시큐리티 암호 해시화

반응형

 

유효성 검사라는 부가적인 로직을 처리했으니

핵심 로직을 처리해준다.

 

@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)

 

스프링 52강. 필터(Filter)와 인터셉터(Interceptor)

스프링 컨테이너와 톰캣은 서로 다른 세상이다. 정확히 말하면 톰캣이 스프링을 감싸고 있다. 웹서버가 먼저 돌아야지! 외부에서 요청이 들어왔을 때 제일 처음 타는 게 web.xml = 문지기이다. 8080

jaewon2336.tistory.com

 

비밀번호를 해시값으로 암호화하는 알고리즘의 종류가 많다.

 

다양한 방법으로 각각 암호화된 값은 알고리즘에 따라 결과가 다 달라진다.

이 중 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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형