Spring Security + OAuth2 Client 사용 문의

문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.
___스프링부트(OAuth2 Client 라이브러리 사용), ID 1103799

안녕하세요, 프로젝트에 카카오 로그인 연동 중 궁금한 점이 생겨 문의드립니다.

현재 계획중인 플로우는
프론트에서 카카오서버로 인가코드 요청 → 카카오서버는 인가코드를 백엔드 주소로 리다이렉트 → 백엔드는 인가코드 받아서 엑세스 토큰 요청, 사용자 정보 가져오기 등을 수행하는 것이었습니다.

이때 백엔드에서는 스프링시큐리티와 OAuth2 Client 라이브러리를 사용해 인가코드를 받는것부터 구현하려고 했는데요,
막상 연동을 해보니 해당 라이브러리를 사용하려면 무조건 인가코드 요청부터 백엔드에서 수행해야 하는게 아닌가 싶은 의문이 들기 시작했습니다. (프론트엔드에서 카카오서버로 인가코드 요청시 state 파라미터를 활용해야 해서 백엔드에서는 인가코드 받기부터 구현하려고 합니다)

백엔드에서만 테스트할때는 사용자 정보를 잘 가져왔는데,
프론트엔드와 연동 테스트를 진행하니 authorization_request_not_found 에러가 나는 것을 확인했고
해당 에러가 나는 이유는 인가코드를 요청하는 과정을 프론트엔드가 OAuth2 CLient를 대신해서 수행하는 과정에서
필요한 몇몇 객체가 null이 되는 것이 아닌가 하는 생각으로 이어졌습니다…

이 생각을 검증하려고 여러 레퍼런스를 찾고있는데 아직 문제를 해결하지 못해서 이렇게 문의글을 남깁니다…!
혹시 알고 계시는 것이 있다면 알려주시면 많은 도움이 될 거 같습니다 :slight_smile:

안녕하세요.

이때 백엔드에서는 스프링시큐리티와 OAuth2 Client 라이브러리를 사용해 인가코드를 받는것 부터 구현하려고 했는데요,

OAuth2 Client 사용하신다면 일반적으로 말씀하신 것 처럼 인가코드 요청부터 백엔드에서 수행 하도록 OAuth2 Client 에 일임 합니다.

OAuth2 Client 는 내부적으로 인가코드요청과 리다이렉트 URI간 state 파라메터를 동일요청자 확인용으로 사용합니다.

참고. 보안권장사항 2.3. state 파라미터 사용 (CSRF 공격 방지)

state파라메터 커스터마이징을 위해 Spring Security Request객체를 커스터마이징하는 것은 권장하지 않습니다.


(1) 앞서 이야기한 것과 같이 front에서 state 파라메터 활용하여 구분하시려면 백엔드 로그인 과정을 자체 구현하시거나

(2) front에서 전달한 구분 값을 backend 세션에 이나 캐시 서버 등에 보관하셨다가 OAuth2 Client 로그인 수행 후 활용하시면 좋을 것 같습니다.

1개의 좋아요

답변 감사합니다! 제가 이해한 것이 맞는지 확인차 재질문 드립니다

(2) front에서 전달한 구분 값을 backend 세션에 이나 캐시 서버 등에 보관하셨다가 OAuth2 Client 로그인 수행 후 활용하시면 좋을 것 같습니다.

위 답변은 OAuth2 Client 라이브러리를 사용해 백엔드에서 인가서버로 인가코드 요청부터 전부 수행하고,
프론트엔드에서http://localhost:8080/oauth2/authorization/kakao URL로 백엔드에 로그인 API 요청을 보낼때 구분값도 함께 request params 등에 전달하라는 말씀이신걸까요?
그리고 해당 구분값을 캐시서버에 보관했다가 추후 로그인 수행이 끝나면 활용해서 쓰면 된다고 이해하면 될까요?

OAuth2 Client 의 로그인 URL로 파라메터 보내 신다면 Request Flitering 구현하셔서 세션ID로 구분값 저장하셔야 할 거고

아래와 같이 별도 URL로 중계 처리 하시면 좀더 편하게 처리 하실 수 있을 것 같습니다.

(1) Front에서 Backend에 구분 값과 함께 로그인 요청
(2) Backend에서 세션ID로 구분값 저장
(3) OAuth2 Client 로그인 URL로 리다이렉트
(4) 로그인 수행 완료 후, Backend에서 세션ID로 구분값 확인

1개의 좋아요

그런데 프론트에서 카카오서버로 직접 인가코드 요청을 보내는 것이 아니고
백엔드로 로그인 요청을 보내서 백엔드가 카카오서버로 인가코드 요청을 보내게 되면

사용자가 카카오에 로그인 하는 화면은 어떻게 띄울 수 있는건가요?

OAuth2 Client에서 kauth authorize URL로 리다이렉트하고 카카오계정 로그인 안되어있다면 카카오 로그인 페이지로 리다이렉트 됩니다.
즉, OAuth2 Client가 합니다.

1개의 좋아요