카카오 로그인 관련 문의드립니다

앱ID : 1119027


spring security를 통해 카카오 로그인을 구현하였습니다. backend 서버를 구현하고 이를 적용하는데 문제가 발생하여 문의드립니다. 먼저 Bastion Host 안에 private subnet으로 백엔드 서버를 두었습니다. 그리고 niginx를 리버스 프록시 서버로 활용해서 백엔드 서버의 ip에 접근하는 방법을 활용하였습니다. 이때 oauth2.0 설정해서 spring yaml 파일에도 그렇고 카카오 디벨로퍼스 애플리케이션에서도 그렇고 redirect url을 저희 서버 api 도메인으로 설정하였습니다. (nginx 퍼블릭 주소) 그러나 redirect 해주는 url이 계속 백엔드의 프라이빗 주소로 리다이렉트 해주는 문제가 발생하였습니다. 프라이빗 서브넷에 있기 때문에 외부에서 접근할 수가 없어 카카오 디벨로퍼스에서 해당 url을 리다이렉트 url로 지정해주어도 타임아웃이 발생합니다. 이런 환경에서는 어떻게 redirect url을 설정해야하는지 의문이 듭니다. spring security에서 어느정도 authorization code와 accesstoken을 주소 받는 프로세스를 자동으로 해주고 있는데 여기에서 문제가 발생하고 있는 걸까요??

안녕하세요.

registration 설정의 redirect-uri 는 어떻게 설정하셨나요?

nginx 퍼블릭 ip 주소로 설정하였습니다.

yaml 설정하신 값과, nginx location 설정하신 값 공유 부탁드려요

security:
oauth2:
client:
registration:
kakao:
client-id: ${KAKAO_ID}
client-secret: ${KAKAO_SECRET}
redirect-uri: https://api-chateat.store/login/oauth2/code/kakao
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
scope:
- account_email
client-name: Kakao

spring yaml 파일은 위와 같이 설정하였습니다.

location / {
# CORS 프리플라이트 요청 처리 (OPTIONS 요청)
if ($request_method = OPTIONS) {
add_header ‘Access-Control-Allow-Origin’ ‘https://www.chateat.store’ always;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, PATCH, DELETE, OPTIONS’ always;
add_header ‘Access-Control-Allow-Headers’ ‘Origin, Content-Type, Accept, Authorization’ always;
add_header ‘Access-Control-Allow-Credentials’ ‘true’ always;
add_header ‘Content-Length’ 0;
add_header ‘Content-Type’ ‘text/plain’;
return 204;
}

    # CORS 응답 헤더 설정
    add_header 'Access-Control-Allow-Origin' 'https://www.chateat.store' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, DELETE, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Expose-Headers' 'Authorization' always;

    # 프록시 설정
    proxy_pass http://10.0.2.171:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Authorization $http_authorization; # Authorization 헤더 전달
}

nginx location 설정입니다!

아래 가이드와 같이 설정해 보시겠어요?

https://docs.spring.io/spring-security/reference/servlet/oauth2/client/authorization-grants.html#oauth2Client-auth-code-redirect-uri
https://docs.spring.io/spring-security/reference/features/exploits/http.html#http-proxy-server

spring:
  security:
    oauth2:
      client:
        registration:
          okta:
            ...
            redirect-uri: "{baseScheme}://{baseHost}{basePort}{basePath}/...."
            ...

계속 keo06 오류 뜨면서 redirect url 이 http://ec2-52-79-76-137.ap-northeast-2.compute.amazonaws.com:8080/login/oauth2/code/kakao 라고 뜹니다ㅠ 해당 주소가 프라이빗 서브넷에 있는 백엔드 주소라 해당 url 을 카카오 디벨로퍼스에 지정을 해줘도 외부에서 접근을 못해 타임 아웃이 뜨네요ㅠ

Spring OAuth2AuthorizationRequestResolver에서 redirect_uri을 위와 같이 전달하고 있기에 로그인 이후 서비스측으로 접근하지 못하는 것으로 보입니다.

외부 노출된(nginx 역방향 설청하신) host가 redirect_uri에 반영되도록 앞서 안내드린 가이드를 참고 부탁드립니다.

제공해주신 공식 가이드를 통해 redirect uri 를 {baseScheme}://{baseHost}{basePort}{basePath}/authorized/{registrationId} 다음과 같이 지정하고 client-authentication-method: none 으로 설정하였습니다. 그러나 아직 백엔드 주소로 redirect 하여 time out이 계속해서 발생하고 있습니다ㅠ
security config 설정은 아래와 같이 구성해주었는데 추가로 설정해주어야하는 값이 있는지 궁금합니다.
.oauth2Login((oauth2Login) →
oauth2Login
.userInfoEndpoint(userInfoEndpointConfig → userInfoEndpointConfig.userService(
customOAuth2MemberService))
.successHandler(oAuth2LoginSuccessHandler)
.failureHandler(oAuth2LoginFailureHandler)
)

확인 가능한 URL 부탁드립니다.

백엔드 api 는 https://api-chateat.store 를 사용하고 있고 프론트 도메인은 https://chateat.store 사용하고 있습니다!

추가 security config관련 코드는 아래와 같습니다ㅠ
https://github.com/kakaotechbootcamp-team13/chateat-backend/blob/dev/src/main/java/com/chateat/chatEAT/config/SecurityConfig.java

http://ec2-52-79-76-137.ap-northeast-2.compute.amazonaws.com:8080/login/oauth2/code/kakao

해당 서비스에 접근 불가 한데요
여전히 위의 redirect_uri 이 사용되어 KOE006 오류가 발생하는 것으로 보입니다.

사용하시는 spring boot 버전 부탁드립니다.

spring 3.3.2 버전 사용하고 있습니다. 해당 url이 퍼블릭 서브넷에서 백엔드 프라이빗 주소로 접근하기 위한 인스턴스 주소입니다ㅠ 그래서 외부에서 접근이 불가합니다. 외부에서 접근이 불가하기에 nginx를 프록시 서버로 활용하여 외부에서 접근하는 방식을 활용하였습니다.

redirect-uri 에 직접 설정만 하셔도 동작 해야 하는데요
서버 배포시 properties가 정상 적용되는지 확인 부탁드립니다.