본인은 보안(security)와 유효성 검사(validation)은 개인적으로 공부해 본 적이 없다. 이번 클론 코딩을 해보며 필요한 부분을 공부해보자. 이게 야생형의 묘미가 아닐까 싶다.
먼저 보안 설정을 완성해보자.
참고: https://tmdrl5779.tistory.com/72
참고에 들어가보면 이해하기 쉽게 정리되어있다. (정말 감사합니다!)
내 나름대로 간단히 정리해보자면 username과 password로 인증 토큰을 얻고 그 토큰으로 인증 객체를 만든다. Spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행한다고 한다. 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인 한다. 그리고 이런 인증과 인가를 위해 Principal을 아이디로, Credietial을 비밀번호로 사용한다고 한다!
코드를 보면 config(page) - auth(page) - PrincipalDetail(class), PrincipalService(class) 이런 식으로 되어 있다. 유저 정보는 세션에 등록해야 하는데 PrincialDetail이 UserDetail을 상속받아 세션에 등록될 정보가 된다. 그리고 PrincipalService로 username이 DB에 있는지 확인하고 password는 자동으로 처리되면서 세션의 정보가 저장이 된다는 것이다.
정말 짧고 이상하게 정리하긴 했는데 그저 구조를 간단히 이해하기 위함이다. 자세한 건 위의 참고를 참고하길 바란다.
구조를 이해했다. 그럼 코드를 이해해보자.
UserDetails와 OAuth2User는 User 오브젝트가 없다. 때문에 회원가입을 위해 두 객체를 상속받고 User 오브젝트까지 추가하여 구현해준다.
이것은 서버에서 직접 인증을 처리해 주는 것과 달리 인증을 중개해주는 메커니즘이라고 한다.
참고1: https://yjh5369.tistory.com/entry/Spring-Boot-OAuth2-–-AuthorizationServer
참고2: https://miracleground.tistory.com/entry/Oauth-기본-개념-정리-im-sprint-auth-oauth-리뷰
Oauth2DetailsService는 다른 서버에서 인증, 인가된 User 정보를 가져온다. 그러고 이 서버에서 랜덤한 비밀번호를 생성 후 첫 로그인이라면 User 정보를 DB에 저장한다. 이미 있다면 PrincipalDetails로 바로 넘겨준다.
이제 완성해보자.
참고: https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/
마찬가지로 정말 잘 정리되어 있다.
마지막으로 저번 게시글에서 스프링 버전에 따라 WebSecurityConfigurerAdapter를 권장하지 않는다고 했기에 Bean에 등록하는 방식으로 바꿨다고 했다.
이것은 모든 메소드에 포함되는 내용이다. 그래서 바뀐 부분이 더 생겼다. AuthenticationManagerBuilder를 받아서 userDetailsService와 passwordEncoder를 설정하는 메소드가 있는데 이것을 삭제하고 PasswordEncoder 자체를 Bean에 등록한다. 그리고 AuthenticationManger를 반환하는 메서드를 Bean에 등록한다. 이는 AuthenticationConfiguration을 받아서 매니저를 꺼내고 그대로 리턴한다. UserDetailsService를 따로 설정 안해도 자동으로 설정이 된다고 이해했는데 이게 맞는 건지는 확실하지 않다. 그래서 모든 코딩이 끝나고 직접 실행하는 단계에서 오류가 있는지 확인하면서 그때 다시 포스팅하겠다.