팀 배정받고 처음으로 지시받은 일은 로그인을 구현하는 과제였다. 사실 서버쪽은 배운 적이 아예없어서 굉장히 어려웠던 것 같다.
일단 우리는 카카오 API를 이용해서 로그인을 구현하고 있다.
지금까지 구현한 로직은 다음과 같다.
카카오 API 문서대로 로그인 구현 -> id token받아오기 -> id token을 앱 서버에 전송 -> access token, refresh token 받아오기
access token만료되었을 때
refresh token 서버에 보내주기 -> 서버에서 새로 갱신된 access token, refresh token받아오기
access token은 앱에 저장되어있는 여러 개인정보들에 접근할 수 있는 권한을 의미한다고한다.
하지만 단점으로는 이 토큰이 만약에 탈취를 당하게 될 경우 꽤나 골치아파진다는 것이다. (나도 모르는 제3의 사용자가 앱 안에 들어있는 내 개인정보들을 열람할 수 있다는 뜻)
그래서 나온 것이 refresh token인데 access token의 유효기간을 짧게 하고(그러면 탈취 당하더라도 유효기간이 짧기 때문에 피해는 적을 것이다.) refresh token의 유효기간을 길게(보통 2주로 잡는다고 한다.)해서 access token이 만료되었을때 다시 서버로 refresh token을 요청메세지로 보내서 갱신된 access token과 refresh token을 다시 받는 것이다.
서버와의 통신은 안드로이드 스튜디오의 retrofit2 라이브러리를 사용하였다.
일단 서버와의 통신이 잘되는지(access token이 잘 받아와지는지 로그를 한번 찍어보았다.)
일단 잘 찍히는 것을 알 수 있다.
그리고 이번엔 여기서 가져온 refresh 토큰을 다시 서버로 보내서 access token과 refresh token을 갱신해주는 작업을 진행해 보았다.
하지만 .....
코드를
<id token건네주고 access, refresh토큰을 받아오는 코드>...1
<refresh토큰 변수에 따로 저장>...2
<refresh토큰 넘겨주고 access, refresh토큰 새로 받아오는 코드>...3
이런 식으로 썼는데 이상하게도 3번에서 유효하지 않은 refresh토큰이라고 서버로부터 메시지가 오는 것이다!!
그래서 refresh토큰만 로그를 찍어보았더니
아무것도 찍히지 않는 것이다!!
한마디로 refresh토큰을 담는 변수에 null값이 저장되었다는 뜻
솔직히 처음에는 이상하다고 생각이 들었다. 분명히 1번,2번 과정에서 refresh값이 저장이 되었을텐데 왜 refresh값이 갱신이 안되었지 라는 느낌이 들었는데
내가 빼먹은 사실이 하나 생각났다. 애초에 retrofit2에서 서버를 통신하는 로직은 비동기 방식인것!!
비동기 방식이기 때문에 1번이 끝나기도 전에 3번이 시작되어서 3번에서 refresh값이 null값으로 서버로 전송이 된 것이다!!
그래서 일단 버튼을 생성해서 버튼을 클릭하면 refresh값이 서버로 전송되게끔 구현하였더니
정상적으로 구현됨을 알 수 있다!!
사실 서버동작 방식은 웹 프로그래밍 시간때 거의 찍먹(?) 수준으로 배웠었다.
그때도 비동기, 동기 방식에 대해 배웠었는데 이론으로만 접해서 잘 와닿지가 않았다.
하지만 여기서 직접 오류를 겪어보고 수정하는 작업을 해보니 어느 정도 서버기초에 대한 개념이 어느정도 잡혀가고 있는 듯 해서 뿌듯하다