2.스프링 시큐리티 [기존 REST API와 연동하기]

dasd412·2022년 1월 31일
0

포트폴리오

목록 보기
20/41

1. 로그인 과정

로그인 인증 작업을 마치게 되면, OAuth 로그인의 경우DefaultOAuth2UserService 구현체의 loadUser(OAuth2UserRequest oAuth2UserRequest) 가 호출된다.

일반 로그인의 경우 UserDetailsService 구현체의 loadUserByUsername(String username) 이 호출된다.

두 메서드의 리턴 값 모두 사용자의 인증 정보를 Spring Security Session 내의 Authentication 객체에 넣어진다.


2. 로그인 이후 세션 정보를 브라우저로 넘기는 과정

인증된 현재 사용자 세션 정보는 @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());
        }
    }
}

이렇게 하면 모든 뷰 리졸브 메서드에 세션 정보를 담는 로직을 알아서 추가하게 된다.


3. 브라우저에서 서버로 REST API를 요청하는 과정


취약점
HTML의 input type=’hidden’ 태그를 사용한 방식이라서 보안 상 취약점이 있을 지도 모른다.

렌더링만 되지 않을 뿐, 요소를 까보면 다 나온다.

profile
시드 레벨 스타트업의 2호 직원으로서 백엔드 시스템의 70%를 설계 및 개발하였고, TIPS 5억 투자 유치에 기여한 서버 개발자입니다. (Go/Python/MSA/Spring)

0개의 댓글