백엔드에서 인가코드로 사용자 정보 조회

문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.


booet.1.3 환경에서 진행중입니다. 963584

프론트 - 카카오 인가 코드 얻기
백엔드 - 프론트로부터 얻어온 인가코드로 토큰 조회, 토큰으로 사용자 정보 조회

이렇게 진행을 하려고합니다.

현재 인가코드를 얻어서 controller를 통해서 토큰을 얻는건 확인해봤는데
controller없이 securityconfig의 oauth2를 사용해서 조회하고자합니다.

securityconfig

public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                //html 공격 막기 위한 csrf 비활성화
                .csrf(AbstractHttpConfigurer::disable)
                //
                .cors(AbstractHttpConfigurer::disable)
                //h2 콘솔 사용 위함
                .headers(c -> c.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable).disable())
                //cors 필터
                .addFilter(corsConfig.corsFilter())
                //url 요청 권한 설정
                .authorizeHttpRequests(config -> config.anyRequest().permitAll())
                .oauth2Login(oauth2Configurer -> oauth2Configurer
                        .successHandler(successHandler()).userInfoEndpoint()
                        .userService(oAuth2UserService))
                //401(Unauthorized), 403(Forbidden) 제어
                .exceptionHandling(c ->
                        c.authenticationEntryPoint(entryPoint).accessDeniedHandler(accessDeniedHandler)
                )
                .sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .apply(new JwtSecurityConfig(tokenProvider))
        ;
        return httpSecurity.build();

OAuth2UserService

| 여기서 정보를 확인 해보고 싶습니다.

public class OAuth2UserService extends DefaultOAuth2UserService {
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        log.debug("userRequest = " + userRequest);
        OAuth2User oAuth2User = super.loadUser(userRequest);
 
        // Role generate
        List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_ADMIN");
 
        // nameAttributeKey
        String userNameAttributeName = userRequest.getClientRegistration()
                .getProviderDetails()
                .getUserInfoEndpoint()
                .getUserNameAttributeName();
        
        // DB 저장로직이 필요하면 추가
 
        return new DefaultOAuth2User(authorities, oAuth2User.getAttributes(), userNameAttributeName);
    }
}

결국 원하는건 프론트에서 얻은 인가코드를 백엔드로 보내서 oauth2가 실행되는건데
method는 post로 보내겠지만 uri를 어떻게 설정해야할지 모르겠습니다.
아니면 인가코드를 백엔드로 넘기면 security의 필터에 안걸리는것인가요

백엔드에서 Spring Security로 카카오 로그인 처리 하시려는 것으로 이해했습니다.

프론트 - 카카오 인가 코드 얻기
백엔드 - 프론트로부터 얻어온 인가코드로 토큰 조회, 토큰으로 사용자 정보 조회
이렇게 진행을 하려고합니다.

프론트에서 인가코드요청하고 리다이렉트 URI를 백엔드로 설정하여 카카오측 로그인 이후 백엔드에 바로 인가코드 전달할 수 있습니다. 프론트에서 백엔드로 인가코드 전달하는 과정 없이 처리하셔도 좋을 것같지만…

결국 원하는건 프론트에서 얻은 인가코드를 백엔드로 보내서 oauth2가 실행되는건데
method는 post로 보내겠지만 uri를 어떻게 설정해야할지 모르겠습니다.

스프링 시큐리티의 OAuth Client를 사용하시면 인가코드요청단계부터 해당 라이브러리에서 진행하므로
인가코드를 넘겨 처리하는 것은 일반적인 처리방식과 달라보입니다.

아래 내용 참고해보시겠어요?

Spring에서 카카오 로그인 사용하기 - Spring Security 5, OAuth 2 - deprecated 대응 2023년 6월 27일

yml 파일에서 redirect uri에
{baseUrl}/login/oauth2/code/{registrationId} 이렇게 되어있는데

redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"

이렇게 그대로 작성하는것이 맞나요?
아니면

redirect-uri: "http://127.0.0.1:5000/login/oauth2/code/{registrationId}"

이렇게 적는건가요??
registrationId는 뭘 뜻하는지 잘 모르겠습니다.

네, 설정이나 접근에 따라 ip, domain, port는 바뀔 수 있으니 {baseUrl}로 설정하고

{registrationId}는 yaml의 registration 이후 키값입니다. 즉, 로그인하려고 하는 소셜로그인 제공자를 의미합니다.

spring:
  security:
    oauth2:
      client:
        registration:
          kakao:

위내용은 spring에서 제공하는 기능이니
자세한 내용은 해당 서비스 가이드를 참고 해보시면 좋을 것 같습니다.

https://docs.spring.io/spring-security/reference/index.html