로그인 인증 작업을 마치게 되면, OAuth 로그인의 경우DefaultOAuth2UserService
구현체의 loadUser(OAuth2UserRequest oAuth2UserRequest)
가 호출된다.
일반 로그인의 경우 UserDetailsService
구현체의 loadUserByUsername(String username)
이 호출된다.
두 메서드의 리턴 값 모두 사용자의 인증 정보를 Spring Security Session 내의 Authentication 객체에 넣어진다.
인증된 현재 사용자 세션 정보는 @AuthenticationPrincipal
등의 방법을 이용해 얻어 올 수 있다. 모든 Controller에서 해당 어노테이션을 부착하고 model.addAttribute()를 활용하면 뷰에 세션 정보를 넣을 수 있다.
그런데, 모든 컨트롤러의 모든 뷰 리졸브 메서드에 일일이 해당 코드를 작성하는 것은 유지보수에 매우 안좋다. 따라서 @ControllerAdvice
를 활용해서 중복을 없앴다.
@ControllerAdvice
public class GlobalControllerAdvice {
//모든 뷰 컨트롤러와 에러 페이지에서 공통적으로 세션정보를 ModelAttribute 하는 로직. 중복 코드를 줄일 수 있다.
@ModelAttribute
public void modelAddSessionInfo(Model model, @AuthenticationPrincipal PrincipalDetails principalDetails) {
if (principalDetails != null && principalDetails.getWriter() != null) {
Writer user = principalDetails.getWriter();
model.addAttribute("userPK", user.getId());
model.addAttribute("userNickName", user.getName());
model.addAttribute("userEmail", user.getEmail());
}
}
}
이렇게 하면 모든 뷰 리졸브 메서드에 세션 정보를 담는 로직을 알아서 추가하게 된다.
취약점
HTML의 input type=’hidden’ 태그를 사용한 방식이라서 보안 상 취약점이 있을 지도 모른다.
렌더링만 되지 않을 뿐, 요소를 까보면 다 나온다.