Ios와 서버를 연동해서 카카오 로그인을 진행하려고 합니다

ios에서 카카오 로그인을 시도하면 (제가 만든) 서버에서 인증을 처리해서 사용자 정보를 받아오고 이를 바탕으로 (제가 만든) 서버에서 생성한 access token과 refresh token을 ios에게 주려고 합니다.
우선 첫 번째로 생각한 방식은 다음과 같습니다.

  1. ios에서 ios SDK를 통해 카카오 Access token을 발급받고 이를 (제가 만든) 서버에게 넘겨준다.
  2. (제가 만든) 서버에서는 access token을 통해 사용자 정보를 가져오고 이 사용자 정보를 데이터베이스와 비교하여 정보가 없으면 회원 가입 처리하고 있으면 로그인 처리하고 access token과 refresh token을 생성해서 ios에게 넘겨준다.

그런데 Access token을 그대로 주게 되면 탈취 당했을 때 정말 많이 위험할 것 같더라고요.
그래서 아래 링크를 보니 인가 코드는 유효 기간이 10분이고 사용 즉시 만료 된다길래 차라리 인가 코드 자체를 서버로 보내는 편이 더욱 안전하겠다고 생각이 들었습니다.

그런데 ios SDK에서는 인가 코드를 못 받고 access token을 받는 것 같더라고요.

결론적으로 제가 궁금한 점은 총 네 가지 입니다.

  1. 카카오 인증을 직접 만든 서버에서 처리하고자 할 때 access token 자체를 넘겨주는게 위험하지 않은지
  2. access token을 넘겨주는게 위험하다면 인가 코드를 넘겨주는게 덜 위험할 것 같은데 ios SDK에서는 access token이 아닌 인가 코드를 받을 수 없는지
  3. ios SDK에서 인가 코드를 받을 수 없다면 웹뷰를 사용하고 REST API 형식으로 인가 코드를 받아와야 할 것 같은데 이 방식이 실제로 가능한지
  4. ios 자체에서 모든 인증을 처리하고 사용자 정보를 받아오는 방식이 아닌 직접 만든 서버를 통해 인증을 진행하고자 할 때 보통 어느 방식을 사용하는지

그냥 access token을 넘겨주는게 가장 간단한 방법인 것 같긴 한데 이 access token을 탈취당하면 만료 전까지 사용자 정보를 볼 수 있는 것 아닌가요? ㅠㅠ
보통 어떤 방식을 사용하는지 너무 궁금해서 혼자 고민하다가 질문 올려봅니다.

  1. 카카오 인증을 직접 만든 서버에서 처리하고자 할 때 access token 자체를 넘겨주는게 위험하지 않은지

네, 액세스토큰은 1인 사용자인 모바일기기에서는 SDK에 일임하여 앱에서 관리하고, 여러 사용자가 접근할 수 있는 웹에서는 서버에서 관리하도록 안내하고 있습니다. 액세스토큰을 전달하는 것은 지양해야합니다.

2 access token을 넘겨주는게 위험하다면 인가 코드를 넘겨주는게 덜 위험할 것 같은데 ios SDK에서는 access token이 아닌 인가 코드를 받을 수 없는지

SDK는 인가코드 요청부터 액세스 토큰 발급까지 SDK내에서 한번에 이루어집니다. OAuth2 의 스펙인 PKCE 보안으로 인가코드를 다른데서 사용할 수 없습니다.

  1. ios SDK에서 인가 코드를 받을 수 없다면 웹뷰를 사용하고 REST API 형식으로 인가 코드를 받아와야 할 것 같은데 이 방식이 실제로 가능한지

네이티브앱 개발 시,
카카오와 교신은 앱에서 사용하는 카카오 SDK에 일임하고
서버에는 카카오로 부터 받은 결과만 저장하시면 좋을 것같습니다.

  1. ios 자체에서 모든 인증을 처리하고 사용자 정보를 받아오는 방식이 아닌 직접 만든 서버를 통해 인증을 진행하고자 할 때 보통 어느 방식을 사용하는지

일반적으로 네이티브앱은 " ios 자체에서 모든 인증을 처리하고 사용자 정보를 받아오는 방식"을 사용하고
"서버를 통해 인증"은 브라우저로 인가요청하고 서버로 리다이렉트 받아 액세스 토큰 발급 및 사용자 조회, 서비스측 회원가입 순으로 처리합니다.

추천드리는 방식은 아래와 같습니다. 참고 부탁드려요.

네이티브앱 개발 시,
카카오와 교신은 앱에서 사용하는 카카오 SDK에 일임하고
서버에는 카카오로 부터 받은 결과만 저장하시면 좋을 것같습니다.

1개의 좋아요

답변 감사합니다! 그런데 아직 궁금증이 완벽하게 해결되지 않아서 추가 질문 좀 드리겠습니다 ㅠㅠ
저는 지금 스프링 부트 서버를 두고 ios에서 이 서버로 api 요청을 보내도록 구성했습니다.
그래서 스프링 부트 서버에서 요청을 보내는 사용자를 식별하기 위해서 스프링 부트 서버에서 생성한 access token과 refresh token을 사용하려고 합니다.
이러려면 서버에서 인가 코드나 카카오에서 발급한 access tokon을 통한 인증이 이루어져야 하지 않나요?
만약 ios에서 조회한 사용자 정보를 서버에게 넘겨준다면 서버에서는 이 요청을 보낸 유저가 진짜 유저라는 것을 어떻게 식별할 수 있을까요?

스프링 부트 서버에서 생성한 access token과 refresh token을 사용하려고 합니다.

이것은 카카오 액세스토큰이 아니라 서버에서 자체 생성한 토큰을 의미하신건가요?

넵 맞습니다! 제 설명이 부족했던 것 같네요
스프링 부트에서 자체적으로 access token과 refresh token을 만들어서 ios에게 주고 이 access token과 refresh token을 통해 인증, 인가를 구현하려고 합니다.
가장 쉬운 방법은 서버 자체적으로 로그인, 회원 가입 로직을 작성하는 것이겠지만 저는 소셜 로그인을 사용하고 싶어서요.
그래서 ios에서 카카오를 통한 사용자 인증을 마치면 서버 자체적으로 생성한 access token과 refresh token을 ios에게 반환하고 싶어요.
그래서 제가 처음 생각했던 방식이 "카카오에서 생성해 준 access token"을 ios에서 제 서버로 넘겨주면 서버에서 이를 검증하고 유저 정보를 받아와서 데이터베이스를 뒤져봅니다.
만약 데이터베이스에 해당 유저 정보가 있다면 서버 자체적으로 생성한 access token과 refresh token을 직접 생성해서 넘겨주고 없다면 데이터베이스에 유저 정보를 저장하고 서버 자체적으로 생성한 access token과 refresh token을 넘겨줍니다.

그런데 본문에 적혀있듯이 access token이 탈취당하면 위험할 것 같아서 다른 대안을 찾아보던 중이었습니다.

즉 카카오로 통한 인증을 진행하는 상황은 “첫 로그인” 혹은 “서버 자체적으로 생성한 refresh token이 만료되었을 때”
이 두 가지 상황이 될테고요 나머지는 서버 자체적으로 생성한 access token과 refresh token을 통해 인증을 진행하려고 합니다.
지금으로서는 카카오에서 만들어준 access token을 서버에게 넘겨주는 방법밖에 떠오르지 않네요…
더 좋은 대안이 있다면 추천해주시면 감사하겠습니다!

스프링 부트에서 자체적으로 access token과 refresh token을 만들어서 ios에게 주고 이 access token과 refresh token을 통해 인증, 인가를 구현하려고 합니다.

이렇게 하면 어떨까요?

여전히 네이티브앱에서는 카카오SDK로 카카오와 교신을 일임하고

[앱에서 카카오 로그인으로 회원가입 시, ]
(1) 스프링 부트 서버에서 토큰 발급
(2) SDK로 카카오 로그인 및 사용자 정보조회 (로그인 과정에 동의창 동의 포함)
(3) 스프링 부트 서버에서 받은 토큰과 암호화된 사용자 정보를 서버에 전달
(4) 서버에서는 자체 토큰 유효성 검증
(5) 앱에서 받은 사용자 정보 중 카카오 로그인 id항목으로 기가입 유저인지 판단
(5-1) 신규가입이면 회원정보 저장
(5-2) 기가입자면 로그인 처리


카카오의 액세스토큰은 서버가 알 필요 없고
스프링부트 서버는 자체 토큰만 검증하면 좋을 것같습니다.

1개의 좋아요

좋은 방법인 것 같네요!
답변해주셔서 감사합니다!

1개의 좋아요

이 방식으로는 여전히 백엔드에서 사용자가 진짜 사용자인지 구분하기 힘들 것 같은데 어떻게 생각하시나요?

서비스 서버로 부터 토큰은 누구나 발급받을 수 있을 것이고(토큰 발급은 인증이 필요하지 않아야 하기 때문에)
따라서 악의적인 해커가 서버 토큰을 받아서 임의대로 만든 사용자 정보를 암호화해서 보내면 문제가 생길것 같아서요

가로채기 공격 방지를 위해 일반적으로 사용하는 방법으로 PKCE를 사용하기도합니다. 아래 내용 참고해주세요.

https://kakao-tam.tistory.com/149

혹시 저한테 답변 주신건가요?

토큰을 받아서 임의대로 만든 사용자 정보를 암호화해서 보내면 문제가 생길것 같아서요

위 링크의 내용과 같이 임의 요청 방지를 위해 요청자의 번들ID, 키해시 등을 전후 체크하셔서 임의 요청 못하도록 하시면될듯합니다.

암호화되어 전달된 id(앱유저ID)로 유효한 고객정보조회되는지 조회된 고객 정보는 일치하는지 Admin Key 방식으로 /v2/user/me 호출해서 검증할 수도 있구요.

그리고 카카오 로그인 OIDC스펙이 있습니다.
카카오 로그인 과정 중 액세스 토큰발급 시, 추가로 전달 받은 id_token 정보를 서버로 함께 전달하여 서버로 전달된 고객정보와 일치하는지 추가로 검증할수도 있구요.

OIDC REST API | Kakao Developers REST API
ID 토큰 유효성 검증하기 이해하기 | Kakao Developers 이해하기

서버 측 호출이 유효한지 가로채기 공격은아닌지 체크하는 것은 중요한 로직일때 일반적으로 필요한 부분으로

위 "네이티브앱에서는 카카오SDK로 카카오와 교신을 일임"하지 않아도 고려해야할 요소인 것 같습니다.

1개의 좋아요