RN expo 와 OIDC 로그인방식

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.


현재 RN expo및 -dev-client와 react-native-kakao-login 라이브러리를 사용하여 프론트단에서 카카오 로그인이 되는것을 확인 하였습니다. (현재 OIDC 활성화중)
주로 IOS로만 테스트하고 있습니다.

현재 진행중인 프로젝트에서 서버단 프레임워크로 스프링부트를 사용하고 있는데요.

생각중인 로그인 및 강제 회원가입 방식은 아래와 같습니다.

  1. 클라이언트 단 (핸드폰에서의 카카오 로그인)에서 카카오 로그인이 완료됐을 때, 리턴값인 refreshToken, accessToken, idToken…을 받아옵니다.
    또한 프로필 조회(라이브러리 내의 메서드 사용)를 통해 사용자의 닉네임과 프로필 이미지 url을 받아오고 있습니다.

  2. 스프링부트로 idToken을 보냅니다. 서버단에서 idToken의 유효성을 검사하게 되고 payload안에 들어있는 정보인 sub와 nickname, profile Image 정보들로 최초로그인일 경우 회원가입을 진행하게 됩니다.

    • 여기서 궁금한건 프론트단에서 id토큰을 검증하고 나온 정보들(sub, nickname, profile_image)을 스프링부트로 보내서 현재 개발중인 서비스에 존재하는 회원인지 아닌지를 가지고 강제 회원가입을 진행하는 방법과 id 토큰을 서버로 보내서 ID 토큰 검증 자체를 서버에서 하는 방법중 어떤게 더 좋을까요?
    • 즉, id토큰의 유효성 검증을 프론트단 또는 서버단 중 어느 곳에서 하는게 좋을까요?
  3. 그 후 스프링부트에서 직접 만든 accessToken과 refreshToken을 클라이언트에게 내려줍니다.

    1. 여기서 자체 accessToken과 refreshToken을 발행해 준다면 굳이 OIDC를 사용할 필요가 없다고 하셨는데 그 이유가 무엇일까요? iOS에서 OIDC를 사용한 카카오톡 소셜 로그인 흐름 관련 질문입니다 - tim.l 님의 게시물 #2
      스프링부트의 api에 접근하려면 서비스내에서 발행한 토큰(accessToken) 검증이 이루어져야 할텐데 그 accessToken이 OIDC로 로그인할 때 카카오에서 발행된 accessToken을 사용하면 된다는 것인가요?

안녕하세요.

프론트-백엔드간 소셜로그인 처리하는 방법은 대략 3가지 정도가 있습니다.

(1) 카카오 SDK에 카카오와 교신을 일임하고 백엔드에는 데이터만 넘기는 방식
(2) 카카오 SDK이용하여 카카오 로그인 후, 액세스 토큰을 백엔드에 전달하여 실제 데이터 교신은 백엔드에서 처리 하는 방식
(3) REST-API 방식을 사용하여 인앱브라우저로 인가코드 요청 부터 모두 백엔드에 일임하거나, 인가코드 요청까지만 앱내 인앱브라우저에서 하고 리다이렉트URI를 백엔드로 설정하여 이후 백엔드에 일임하는 방식

카카오 SDK를 사용 가능한 네이티브앱 환경이라면, (1)번을 사용할 수 없는 경우라면, (3)번을 추천합니다.
하지만, 개발하시는 상황과 환경에 따라 어떤식으로 구현하셔도 상관없습니다.


이때 개발하신 시스템의 백엔드 API 접근은 별개의 개념입니다.


  • 여기서 궁금한건 프론트단에서 id토큰을 검증하고 나온 정보들(sub, nickname, profile_image)을 스프링부트로 보내서 현재 개발중인 서비스에 존재하는 회원인지 아닌지를 가지고 강제 회원가입을 진행하는 방법과 id 토큰을 서버로 보내서 ID 토큰 검증 자체를 서버에서 하는 방법중 어떤게 더 좋을까요?

일반적으로 토큰 검증은 백엔드에서 진행합니다만, 어떤게 더 좋다는 기준은 없습니다. 운영하시는 환경 종속적으로 선택하시면됩니다.

여기서 자체 accessToken과 refreshToken을 발행해 준다면 굳이 OIDC를 사용할 필요가 없다고 하셨는데 그 이유가 무엇일까요?

“자체 jwt 토큰 발행한다면 굳이 (카카오로그인) OIDC를 사용할 필요는 없을듯합니다.” 라고 안내드렸었는데요.
자체 jwt 토큰 발행과 (카카오로그인에서) "accessToken과 refreshToken을 발행"은 다른 의미입니다.

Oauth2는 자원에 대한 인가를 담당하는 소셜로그인이고 인증은 따로 구현하셔야합니다.
Oauth2의 확장스펙인 (카카오로그인) OIDC는 jwt 형식 인증 토큰도 소셜 프로바이더에서 발행하는 개념이므로
자체적으로 인증토큰을 발행한다면 (카카오로그인) OIDC 인증 토큰을 사용할 필요는 없다는 의미입니다.

스프링부트의 api에 접근하려면 서비스내에서 발행한 토큰(accessToken) 검증이 이루어져야 할텐데 그 accessToken이 OIDC로 로그인할 때 카카오에서 발행된 accessToken을 사용하면 된다는 것인가요?

자체 개발하신 스프링부트의 api는 자체적으로 jwt토큰 발행하셔서 검증하시면되고 굳이 카카오 API와 강결합할 필요는 없습니다.


용어의 개념이 혼재/혼동된듯하여 정리하자면 아래와 같습니다.

(1) 카카오 로그인을 이용해 발급받은 accessToken 은 카카오 API호출에만 사용하시면됩니다.
(2) 구현하신 백엔드 API 접근 가능한 인증은 자체 발급하신 jwt 토큰을 사용하셔도되고 OIDC id token을 사용하셔도 됩니다.

예를들어 구현하신 시스템에 카카오 로그인 뿐만아니라 구글로그인도 함께 적용했을때
백엔드 API 접근을 어떻게 처리할 것인가를 기준으로 생각해보시면 자체 jwt토큰을 발행해 접근 제어 하시는게 이점이 있는지 기준으로 판단해보시면됩니다.

답변 매우 감사드립니다!

혼동하고 있는 용어 정리를 해주셔서 깔끔하게 이해하였습니다.

추가로 궁금한건 몇몇 앱들에서는 한번 로그인 한 후에 거의 영원히(?) 로그인이 유지되고 있는데요.
이러한 방식은 서비스 자체적으로 구현하면 되는걸까요?

예를들어 refreshToken의 기간을 매우 길게 잡는다던가 또는 accessToken을 재발급할 때 refreshToken 또한 재발급 해줘서 유지한다던가 하는 방식을 생각해 보았습니다.

추가로 궁금한건 몇몇 앱들에서는 한번 로그인 한 후에 거의 영원히(?) 로그인이 유지되고 있는데요.
이러한 방식은 서비스 자체적으로 구현하면 되는걸까요?

네, 대부분의 앱 서비스들이
각종 소셜 프로바이더들의 로그인 방식과 무관하게
로그인 한 이후에는 자체 DB에 고객정보를 저장하고 서비스 자체적으로 발급한 토큰 정보를 세팅하여 로그인을 유지합니다.

다만, 너무 긴 로그인 유지는 보안에 문제가 있을 수 있으며
계정 탈취등의 사유로 앱과 별개의 웹에서 자체 발급한 토큰 만료 기능을 제공하여 개별 기기의 로그인을 제한합니다.

참고 부탁드려요.

1개의 좋아요