Week3 TIL 리스트업
- 14일차: Spring Boot default-DB/ @Component/ scheduler / MYSQL연동 / gitIgnore /EC2 배포
- 15일차: @JsonIgnore / request / @Controller / HTTP / @ResponseBody / MVC 동작원리 /CS 스터디
- 16일차: HTTP Request message / DI / IoC 컨테이너
- 17일차: 인증, 인가 / 쿠키, 세션 / Spring Security
- 18일차: OAuth2.0 / SSO / JWT (항해일지 18일차)
- 19일차: Spring Test Framework
Spring Security
오늘 복습하며 과제에 구현하며 정리
회원가입 과정은 @Entity User 객체를 하나 생성하는 과정으로, 주로 Validation check하는 과정이다.
스프링 시큐리티의 주된 구현은 로그인 과정에서 발생한다.
위 그림이 정말 핵심만을 담은 것 같다는 생각이 들었다.
구현한 로그인 방식은 총 2가지로 로그인폼 / SSO 였다.
로그인 폼의 경우 클라이언트가 입력한 username/password가 Authentication Manager에게 전달되고, 이는 UserDetailsService에게 전달되어 DB에서 같은 username의 계정정보를 가져온다.
-> loadUserByUsername
이 후 찾아온 User 객체를 UserDetail의 생성자에 담아 보낸다.
UserDetail에선 해당 User 정보에 대해 getter를 비롯한 다양한 정보를 가져올 수 있는 메서드들을 정의한다. 그중 getAuthorities() 부분은 실제 권한을 부여하는 메서드이다.
이렇게 User 정보를 담은 UserDetail은 Authentication Manager에 의해 클라이언트가 입력한 값과 비교되고, 일치한다면 Session에 로그인한 유저의 정보가 등록된다.
이렇게 생성된 세션 정보는 컨트롤러 메서드의 파라미터 자리에@AuthenticationPrincipal UserDetail userDetail로 불려와 자유롭게 사용 가능하다. (유저 정보를 사용해야되는 경우가 많았는데 참 편리하다는 생각이 들었다.)
OAuth 2.0
위 방식으로 카카오 계정으로 로그인하는 과정 또한 구현했다.
순서는 위 그림과 같은데, 역시 로그인하여 인가를 받는 과정이 중점적인 구현부이다.
클라이언트가 카카오 계정 로그인 동의를 완료하면 콜백함수로 지정한 URI로 인가 code가 넘어온다.
이를 받고 부터는 웹과 웹 간의 통신을 구현한다.
받아온 인가 코드로 카카오에게 액세스 토큰을 요청한다.
액세스 토큰을 성공적으로 받아왔다면, 이 토큰을 다시 보내 계정 정보를 받아온다.
받아온 카카오 계정 정보를 가지고 신규 회원이라면 User 객체를 생성하여 강제 로그인 / 기존 회원이라면 기존 User 객체에 카카오 id만 set해주고 강제 로그인
강제 로그인은 UserDetail(kakaoUser) 생성하고 UsernamePasswordAuthenticationToken 생성한 뒤, SecurityContextHolder에서 컨텍스트를 불러와 setAuthentication해주면 된다.