ios에서 카카오 로그인을 시도하면 (제가 만든) 서버에서 인증을 처리해서 사용자 정보를 받아오고 이를 바탕으로 (제가 만든) 서버에서 생성한 access token과 refresh token을 ios에게 주려고 합니다.
우선 첫 번째로 생각한 방식은 다음과 같습니다.
ios에서 ios SDK를 통해 카카오 Access token을 발급받고 이를 (제가 만든) 서버에게 넘겨준다.
(제가 만든) 서버에서는 access token을 통해 사용자 정보를 가져오고 이 사용자 정보를 데이터베이스와 비교하여 정보가 없으면 회원 가입 처리하고 있으면 로그인 처리하고 access token과 refresh token을 생성해서 ios에게 넘겨준다.
그런데 Access token을 그대로 주게 되면 탈취 당했을 때 정말 많이 위험할 것 같더라고요.
그래서 아래 링크를 보니 인가 코드는 유효 기간이 10분이고 사용 즉시 만료 된다길래 차라리 인가 코드 자체를 서버로 보내는 편이 더욱 안전하겠다고 생각이 들었습니다. https://devtalk.kakao.com/t/redirect-uri-get/125240
그런데 ios SDK에서는 인가 코드를 못 받고 access token을 받는 것 같더라고요.
결론적으로 제가 궁금한 점은 총 네 가지 입니다.
카카오 인증을 직접 만든 서버에서 처리하고자 할 때 access token 자체를 넘겨주는게 위험하지 않은지
access token을 넘겨주는게 위험하다면 인가 코드를 넘겨주는게 덜 위험할 것 같은데 ios SDK에서는 access token이 아닌 인가 코드를 받을 수 없는지
ios SDK에서 인가 코드를 받을 수 없다면 웹뷰를 사용하고 REST API 형식으로 인가 코드를 받아와야 할 것 같은데 이 방식이 실제로 가능한지
ios 자체에서 모든 인증을 처리하고 사용자 정보를 받아오는 방식이 아닌 직접 만든 서버를 통해 인증을 진행하고자 할 때 보통 어느 방식을 사용하는지
그냥 access token을 넘겨주는게 가장 간단한 방법인 것 같긴 한데 이 access token을 탈취당하면 만료 전까지 사용자 정보를 볼 수 있는 것 아닌가요? ㅠㅠ
보통 어떤 방식을 사용하는지 너무 궁금해서 혼자 고민하다가 질문 올려봅니다.
답변 감사합니다! 그런데 아직 궁금증이 완벽하게 해결되지 않아서 추가 질문 좀 드리겠습니다 ㅠㅠ
저는 지금 스프링 부트 서버를 두고 ios에서 이 서버로 api 요청을 보내도록 구성했습니다.
그래서 스프링 부트 서버에서 요청을 보내는 사용자를 식별하기 위해서 스프링 부트 서버에서 생성한 access token과 refresh token을 사용하려고 합니다.
이러려면 서버에서 인가 코드나 카카오에서 발급한 access tokon을 통한 인증이 이루어져야 하지 않나요?
만약 ios에서 조회한 사용자 정보를 서버에게 넘겨준다면 서버에서는 이 요청을 보낸 유저가 진짜 유저라는 것을 어떻게 식별할 수 있을까요?
넵 맞습니다! 제 설명이 부족했던 것 같네요
스프링 부트에서 자체적으로 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) 기가입자면 로그인 처리
카카오의 액세스토큰은 서버가 알 필요 없고
스프링부트 서버는 자체 토큰만 검증하면 좋을 것같습니다.