카카오 소셜 로그인 rest api 설정에 관한 질문

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


java jdk 17, spring Framword 3.x.x 사용.


안녕하세요
카카오 소셜 로그인 rest api 설정 중 redirection-url 설정에 대해서 궁금증이 생겨 질문들 드립니다.
카카오톡 로그인(OAuth) 구현 시 책임 분배 관련하여 질문드립니다 글의 댓글을 보면

‘클라이언트에서 인가 코드를 받고 서버에 전달하는 과정은, 서비스 측 시스템 구성상 확고한 이유가 없다면 이와 같이 전달하는 것은 적절하지 않습니다.’ 와 같은 내용이 있습니다.

그래서, 백엔드 서버에서 인가코드를 발급받고, 바로 토큰을 발급하는 과정을 진행하는 과정을 해보았습니다.
redirect-url은 백엔드 서버에 맞게 작성하였고, 발급된 인가 코드를 받을 수 있는 Controller api도 작성하였습니다.

저는 소셜로그인 말고 일반 로그인을 할때, jwt토큰으로 만든 accessToken은 json으로 클라이언트에게, refreshToken은 쿠키로 설정하였습니다.
이와 같은 방식으로 진행하고자 하였으나, 위에 작성한 '발급된 인가 코드를 받을 수 있는 Controller api’는 카카오 서버에서 호출하는 하는 것이기 때문에 프론트 쪽으로 json으로 보낼 방법을 찾지 못하였고, 그러다 보니 프론트에서 인가코드를 발급받아 전달하는 방식을 생각하였습니다.

만약 백엔드 서버에서 인가 코드 발급 및 토큰을 모두 처리한다면 jwt토큰으로 만든 accessToken을 어떤 방식으로 처리하여야 하는지 궁금합니다. (지금 당장에는 헤더밖에 떠오르지 않는데, 실제로는 어떤 방식이 효율적인지 궁금합니다.)

안녕하세요.

카카오로그인 처리와 무관하게 자체 발급한 jwt를 프론트로 전달하는 것과 인가코드를 프론트로 받아 백엔드로 Request하며 Response로 자체 jwt까지 함께 처리 하는 방식을 생각하신것 같습니다.

이부분은 개발환경에 종속적인 부분이라 환경에 따라 자유롭게 선택하시면 됩니다.


프론트와 백엔드가 구분되지 않는 스크립틀릿(asp, jsp, php) 환경 등에서는 jwt를 프론트로 전달할 고민이 필요없고,
모바일 기기에서 단독사용하는 네이티브앱이라면, 프론트 SDK에 모든 과정을 일임하기도 합니다.

웹 환경에서 프론트/백엔드가 분리된 경우
스프링 OAuth Client 사용하시면, 백엔드에 인가코드 요청 부터 모든 과정을 일임하고,
카카오 액세스토큰발급을 자체 구축하셨다면, 리다이렉트 URI를 백엔드로 받아 처리하기도 하지만.

사용하는 OAuth 라이브러리에서 인가코드요청과 액세스 토큰 발급간 state 파라메터 동일 출처 검증하면 인가요청과 토큰발급을 따로 분리할 수 없기도 합니다.

참고 2.3. state 파라미터 사용 (CSRF 공격 방지)

구상하신 것과 같이 인가코드를 프론트로 받아 백엔드로 전달도 못할 것은 없지요.


백엔드에 토큰 보관을 권장하는 것은 불필요한 외부 접근을 차단하기 위함이고,
회원가입과 같이 민감정보가 반드시 프론트와 교신해야하는 경우도 있으니 암호화, https통신, PKCE와 같이 적절한 보완책만 있으면 됩니다.

보안 권장사항 | Kakao Developers 보안 권장사항


백엔드에서 프론트로 리다이렉트 해야는 경우,

  • jwt는 httponly 쿠키에 담아 전달하기도하고,
  • 프론트 get 파라메터로 그냥 jwt 전달하되 jwt 내 nonce 파라메터 상호 검증해서 보완할 수도 있고 (유출되도 사용할 수 없게)
  • 캐시 서버에 jwt 수명만큼 일시 보관하는 방법도 사용할 수 있습니다.

문의주신 환경에서 개발 편의성만 본다면 인가코드를 프론트로 받아 백엔드로 Request하며 Response로 자체 jwt까지 함께 처리 하는 방식도 사용할 수 있습니다.