문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.
앱ID : 440d01e6fdfe4ac592c08f62d3995d20
redirect-uri : http://localhost:8080/auth/kakao/login
현재 Spring Security로 카카오 로그인 구현중인데, 로직은 프론트(현재는 테스트용html 같은포트로 만듬)에서
<a href="/oauth2/authorization/kakao">login with kakao</a>
이렇게 요청하면
사용자 입력을 받아서 시큐리티가 모든 로그인 과정을 수행한 뒤 다른 페이지를 반환하게(redirect)하게 구현했습니다. 하지만 아래와 같은 화면이 계속해서 반복됩니다. 동의하고 계속하기를 눌러도 계속 이 화면밖에 안나옵니다.
핸들러에도 로그가 찍히는건 없습니다…
application.yml
spring:
security:
oauth2:
client:
registration:
kakao:
client-id: 440d01e6fdfe4ac592c08f62d3995d20
redirect-uri: http://localhost:8080/auth/kakao/login
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
client-name: Kakao
scope:
- profile_nickname
provider:
kakao:
authorization-uri: https://kauth.kakao.com/oauth/authorize
token-uri: https://kauth.kakao.com/oauth/token
user-info-uri: https://kapi.kakao.com/v2/user/me
user-name-attribute: id
SecurityConfig.java
@Bean
protected SecurityFilterChain filterChain(final HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable) //csrf 비활성
.formLogin(AbstractHttpConfigurer::disable) //폼 로그인 비활성
.httpBasic(AbstractHttpConfigurer::disable) //HTTP 기본인증 비활성
// 시큐리티가 세션을 만들지도 사용하지도 않음.
.sessionManagement((sessionManagement) ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
// 특정 URL에 대한 권한 설정
.authorizeHttpRequests(request -> request
.requestMatchers("/","/success","/reissue", "/css/**","/images/**","/js/**","/favicon.ico").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(oauth2Login ->
oauth2Login
.userInfoEndpoint(userInfoEndpoint ->
userInfoEndpoint.userService(customOAuth2UserService))
.successHandler(customOAuth2SuccessHandler) // 동의하고 계속하기를 눌렀을 때 Handler 설정
);
return http.build();
}
Successhandler
@Component
@RequiredArgsConstructor
public class CustomOAuth2SuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("OAuth2 Login 성공!");
CustomOAuth2User oAuth2User = (CustomOAuth2User) authentication.getPrincipal();
System.out.println("Principal에서 꺼낸 OAuth2User = {}"+ oAuth2User);
String redirectURL = "http://localhost:8080/success";
response.sendRedirect(redirectURL);
}
Controller
@Controller
public class HomeController {
//test
@GetMapping("/")
public String root() {
return "index";
}
// test
@GetMapping("/success")
public String home() {
return "hello home";
}
}