본문 바로가기

Dev/Spring Boot

[Spring Security] 수동 로그인 구현하기

728x90

스프링 시큐리티를 사용해 프로젝트를 진행하던 중 카카오로 로그인 요청을 했을 때 회원가입이 안되어있으면 회원 가입을 하고 아니면 바로 로그인이 되는 기능을 구현하였다.

 

@GetMapping("/auth/kakao/callback")
    public String kakaoCallBack(String code, HttpServletRequest request) throws ParseException {
        String username = loginService.requestKakaoToken(code);

	loginService.forcedLogin(username, request);

        return "redirect:/";
    }

 

먼저 카카오 콜백 메소드이다. 유저네임 = 이메일을 카카오를 통해 전달받는다. 이 부분을 굳이 보여주지는 않는다.

 

public void forcedLogin(String username, HttpServletRequest request){
        User user = this.userRepository.findByUserName(username);

        Authentication authentication = new UsernamePasswordAuthenticationToken(new UserDetail(user), null, Collections.emptyList());
        SecurityContext securityContext = SecurityContextHolder.getContext();
        securityContext.setAuthentication(authentication);

        HttpSession session = request.getSession(true);
        session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
    }
  • Authentication authentication = new UsernamePasswordAuthenticationToken(new UserDetail(user), null, Collections.emptyList());
    • UsernamePasswordAuthenticationToken 객체를 생성해 인증 정보를 만든다. 여기에 UserDeatil, 비밀번호 그리고 권한이 들어가는데 나는 간단한 토이 프로젝트를 진행할 것이므로 권한이 필요 없어서 만들지 않았다.
  • SecurityContext securityContext = SecurityContextHolder.getContext();
    securityContext.setAuthentication(authentication);
    • SecurityContextHolder에서 현재 SecurityContext를 가져오고, 여기에 새로 생성한 Authentication 객체를 강제 주입한다. 
  • HttpSession session = request.getSession(true) 
    • HTTP 세션을 가져와 SPRING_SECURITY_CONTEXT라는 이름의 속성에 SecurityContext를 저장한다.

Spring Security에서 가장 유명한 그림

 

우리는 이 그림에서 가장 마지막 10번에 SecurityContextHolder에 있는 SecurityContext를 가져와 그 안에다가 직접 Authentication을 넣어주는 작업을 했다고 보면 된다. 그리고 저 Authentication을 2번의 UsernamePassAuthenticationToken을 사용해 User정보로 UserDetatil을 생성하여 만들어 삽입해주었다.

 

즉, 원래 로그인을 시도하면 만들어지는 작업을 직접해주었다고 보면 된다.