Oauth, jwt 관련 질문 드립니다

안녕하세요. oauth와 jwt관련 질문이 있습니다.

현재 안드로이드,ios와 스프링으로 간단한 토이 프로젝트 앱을 개발하고 있습니다.

oauth와 jwt로 인증 인가를 구축할 것 같은데요, 구현 방법에 질문이 있습니다.

공통 : 회원 테이블에 provider와 provider_id칼럼이 등록되어있습니다.

1안

  1. 안드로이드/ios에서 oauth서버로 인증을 진행한뒤 http에 provider와 provider_id만 담아서 스프링 서버로 전송
  2. 스프링 서버에서는 provider와 provider_id만을 가지고 내부 회원 db에서 조회 후 jwt토큰 발급

2안

  1. 안드로이드/ios에서 oauth서버로 인증을 진행한뒤 provider와 provider_id, 액세스 토큰을 http에 담아 스프링 서버로 전송
  2. 스프링서버에서는 액세스 토큰을 활용해 해당 OAuth 제공자에서 제공하는 API를 사용하여 검증
  3. provider와 provider_id가 유효할 경우에만 내부 회원 db에서 조회 후 jwt토큰 발급

제 생각에는 1안이 provider와 provider_id를 무차별적으로 조합해서 보내면 쉽게 뚫릴것 같은데

카카오공식 답변에서는 액세스 토큰을 직접 보내면 안된다하더라고요

https://devtalk.kakao.com/t/oauth2/128079

질문은 다음과 같습니다.

  1. oauth와 jwt를 활용해서 서버를 구축할 때 1안으로 구현하는게 맞는지 (서버에 provider와 provider_id만 보내기)1-1. 만약 아니라면 어떤 방식으로 구현해야하는지
  2. 1안이 맞다면 provider와 provider_id를 무차별적으로 조합해서 보내면 쉽게 뚫리는 것이 아닐지
  3. 액세스 토큰을 직접 보내 서버에서 검증하게 될 경우(2안)은 왜 위험한지가 궁금합니다.

안녕하세요.

  1. oauth와 jwt를 활용해서 서버를 구축할 때 1안으로 구현하는게 맞는지 (서버에 provider와 provider_id만 보내기)1-1. 만약 아니라면 어떤 방식으로 구현해야하는지
  2. 1안이 맞다면 provider와 provider_id를 무차별적으로 조합해서 보내면 쉽게 뚫리는 것이 아닐지

네, 이방식을 추천합니다.
다만, 말씀하신 문제를 해소하기 위해 정해진 동선에서 처리하는게 맞는지 검증하시면 좋을 것 같습니다.

OAuth2 인증 스펙에 가로채기 공격을 막기위해 사용하는 PKCE(Proof Key for Code Exchange) 스펙이 있습니다. 참고하셔서 API 호출 전후 검증을 유사하게 처리하시면 좋을 것같습니다.
OIDC 확장 스펙에서 nonce파라메터를 사용하는거나 카카오 로그인 시, state파라메터에 난수를 전달하여 검증하는 방식 등
무작위 입력이 염려될때 일반적으로 API호출 전, 후 동선에서 추가 값을 검증하는 형태로 말씀하신 문제점을 회피합니다.

  1. 액세스 토큰을 직접 보내 서버에서 검증하게 될 경우(2안)은 왜 위험한지가 궁금합니다.

어떤 방법으로든 액세스 토큰이 노출되면 카카오에서 제공하는 액세스토큰 방식 API 호출에 활용될 수 있으니
근본적으로 노출 차단되도록 백엔드에서만 관리하거나 SDK내 사용으로 제한하는 것을 권장합니다.