토큰 처리와 동의 관련 문의

안녕하세요. 자바 스크립트로 웹 기반 환경에서 개발 하고 있는 중 인데요.
아무리 메뉴얼을 봐도 토큰 처리와 동의 절차 부분에서 좀 애매한 부분이 있어서 문의 드려요~

일단, SDK의 Kakao.Auth.Login 를 통해 액서스 토큰을 받고 있구요. 필요한 최소한의 동의를 구성하였어요.

1. 토큰

토큰을 받은 다음 다른 API 를 활용하고 있습니다. 메뉴얼에 보면 1~2 시간 정도 토큰이 유지된다고 되어 있고 시간이 더 필요할 경우 RefreshToken 을 통해 새로 받아 내려야 한다고 되어 있는데요. 필요시 잠깐 API 를 사용하는 수준이기 때문에 한달 가까이 되는 장기 토큰은 필요가 없어요.

여기서 질문을 내어보면

  1. 해당 예외 처리를 하기 위해서, 토큰 받는 시점에서 시간을 계산해서 필요 기점 마다 갱신(새로 받는) 하는 식으로 구현 하는 방법과 다른 API 호출 도중 -401 예외와 마주치게 되면 다시 받도록 하는 방법이 예상되는데요. 토큰 시간이 정말 칼같이 정확하게 유지 될지 애매하기 때문에 두가지 다 처리 하는게 맞는거 같은데 제 예상이 맞을 까요?

  2. RefreshToken 을 이용하지 않고 AccessToken 를 다시(갱신) 받는 방법은 다시 Kakao.Auth.Login 를 호출하는 방법 밖에 없나요?

  3. 2 번 방법이 맞다면 호출 시점에 두가지 경우가 예상되는데

    • 이미 로그인 되어 있고 아직 토큰이 살아있는 경우.

    • 이미 로그인 되어 있고 토큰은 소멸된 경우

      두가지 경우에서 Kakao.Auth.Login 을 호출하게 되면 각각 어떻게 되는 걸까요? 토큰이 아직 살아 있어도 새로운 토큰으로 SDK 가 스스로 갱신 하나요? 토큰이 소멸된 경우 유저는 아이디 비밀 번호를 다시 입력해야 되나요?

2. 동의

최소한의 동의 요소로 설정해두고 만약 추가 동의가 필요해서 동의 내용을 변경하게 되면 추가 동의 인증이 필요하게 될텐데 관련 API 가 없어서 어떻게 처리되는지 궁금 합니다.

  • 이미 로그인 하고 기존의 동의까지 하고 사용 하던 사용자들의 토큰은 앱 설정 변경 순간 모두 만료 되나요? 만약 그렇다면 로그인 상태가 자동으로 not_connected 로 변경되어 다시 로그인 루틴으로 연결되고 로그인 한 다음 새로운 동의를 구하는 페이지가 다시 생성되는 식일까요?

개념이 혼란스러워 다소 추론적으로 질문을 하게 되었는데요. 여러가지 경우에 대해서 테스트 할 시간도 촉박하고 어디 까지나 제 추론으로 개발하기는 부담스러운 프로젝트라 도움좀 부탁 드려요.

답변 드리겠습니다.

  1. 토큰
  1. 처리하는 방법은 여러가지가 있을 수 있지만 javascript sdk에서는 로그인 상태 확인을 위해 다음과 같은 함수를 제공하고 있습니다. (시간을 계산하는 것 보다 API 호출이나 SDK 함수를 통해서 체크하는 것이 정확하다고 판단됩니다.)
    https://dev.kakao.com/docs/js-reference#kakao_auth_getstatus(callback)
  2. Kakao.Auth.Login 함수 호출을 통해서만 토큰 갱신이 가능합니다.
  1. 동의
  • 토큰을 만료시키지는 않습니다.
  • 동의 항목이 추가 된다면 SDK 함수 호출 시 추가된 동의를 받기 위해서 동의창이 뜨게 됩니다.

안녕하세요. 친절한 답변 감사드립니다.

덕분에 어느정도 정리되었습니다.

송구스럽지만, 첫번째 질문이 조금 정리가 안되서 그러는데요.

  • 로그인이 되어 있지만 토큰만 만료된 경우 GetStatus 함수는 connected 를 반환하나요?
  • GetStatus, sdk 함수는 네트워크 통신 없이 바로 쿼리 개념이라 빈번하게 호출해도 괜찮은 걸까요?
  • 매번 갱신을 시킬 순 없기 때문에 만기 시간까지 80% 정도 도달했을때 자동으로 다시 갱신 요청 시키고 API 호출중 -401 예외를 만나게 되면 다시 로그인 창을 띄울까 하는데 이렇게 해도 괜찮을까요?

추가 질문을 드려 죄송하구요. 먼저 답변 도움 많이 되었습니다. 감사합니다.

답변드리겠습니다.

  • Kakao.Auth.getStatus 함수는 access token 이 만료되면 not_connected 를 반환합니다.
  • Kakao.Auth.getStatus 함수는 네트워크 통신이 있는 요청입니다.
  • -401 일 때 로그인 창을 띄우는 방법도 있고 아래 샘플과 같이 구현하는 방법도 있습니다.
    저도 궁금한 점이 있습니다. 위에서 말씀해주신 만료 시간 80%를 체크하는 방법이 모호할 것 같은데 어떤 방법을 사용하실 계획인가요?
Kakao.Auth.login({
    success: function(res) {
        Kakao.API.request({
            url: '/v1/api/talk/memo/send',
            ... 생략 ...
            success: function(res) {
                alert('success!');
            },
            fail: function(error) {
                alert('error! \n' + JSON.stringify(error));
            }
        })
    },
    fail: function(error) {
        console.log(error);
    }
});

안녕하세요.

  1. 80% 채크
  • 로그인 당시에 넘어오는 expires_in 값을 가지고 마감 시간을 타임스템프로 저장 해두고 서비스 개시 될때 백그라운드로 사용 사간이랑 비교해 RefreshToken 으로 갱신하는 방법으로 처리 했는데 잘 되는 거 같아요.
  • 백그라운드 처리는 워커나 타이머 등이 있을 수 있을 거 같은데 저는 그냥 프레임웍에 만들어둔 루프가 있어서 거시서 처리 했어요.
  1. 플로우
  • 서비스 개시 시점에 로그인 여부 확인
  • 상태가 로그인이 필요 하게 되면 기존에 리플레시 토큰이 있다면 그걸로 복원 시도
  • 복원이 불가능 하면 다시 로그인 시작
  • 상태가 로그인이가능 하면 그냥 서비스 바로 개시
  • 백그라운드에서 만기 도래 80%에서 토큰으로 갱신 처리

요렇게 처리 했어요.

감사합니다.