박상권의 삽질블로그

[안드로이드/Android]Retrofit에서 Interceptor를 이용해 쿠키/세션 유지하는 방법 본문

IT/Android-TIP (한글)

[안드로이드/Android]Retrofit에서 Interceptor를 이용해 쿠키/세션 유지하는 방법

박상권 2016. 1. 12. 21:58

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여



블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


Retrofit은 우리가 해주어야할 귀찮은 네트워크 통신 작업을 대신해주는 정말 유용한 라이브러리입니다.

[안드로이드]유용한 라이브러리 - Retrofit(REST API 통신)



REST API통신을 할때 정말 유용하고 편하게 사용할 수 있습니다.

안드로이드 앱을 개발하시면서 로그인을 필요로 하는 서비스를 만들어야 하는 경우가 있습니다.




로그인을 하는경우 로그인 유지를 위해서 클라이언트는 쿠키를, 서버는 세션을 이용하게 됩니다.


(쿠...쿠키 땡긴다...)










안드로이드에서 CookieStore를 이용하면 처음에 앱을 실행하고 로그인한뒤 이루어지는 모든 Request에 대해서 쿠키를 유지해서 계속 로그인된 사용자임을 알려줄 수 있습니다.

하지만 CookieStore는 앱을 다시 실행하면 새로운 cookie를 생성하기때문에 다시 로그인해야하고

그렇게 된다면 매번 실행시마다 로그인을 해주어야 하는 작업을 해주어야 합니다.













로그인횟수집계나 기타 로그인시 필요한 정보나 데이터를 받기위해서 실행시마다 로그인이 필요한 경우도 있겠지만, 

어쨌든 실행할때마다 새로운 쿠키값이 생기는것은 클라이언트에게나 서버에게나 좋지 않은 방식일 것입니다.

같은 사용자가 사용함에도 불구하고 쿠키가 새로 만들어지기때문에 서버는 계속 새로운 세션을 생성하게 되고 이는 나중에 의도하지 않은 문제를 야기시킬 수 있습니다.



Retrofit에서 사용하는 Okhttp를 이용하여 실행시마다 항상 같은 쿠키값을 유지하는 방법에 대해서 포스팅 해보겠습니다.















요약


1. 로그인한뒤 받은 Response에서 쿠키정보를 가져온다.

2. 가져온 쿠키정보를 안드로이드의 SharedPreferences에 저장해둔다.

3. 이후 수행되는 Request마다 SharedPreferences에서 쿠키를 가져와서 Header에 추가해서 보낸다.















구현 방법은 생각보다 간단합니다.


Response로부터 쿠키정보를 가져와서 Preference에 저장하는 ReceivedCookiesInterceptor클래스를 만들어 줍니다.

Request마다 Preference에 저장되어있는 쿠키값을 함께 Header에 넣어주는 AddCookiesInterceptor클래스를 만들어 줍니다.



2개의 ReceivedCookiesInterceptor, AddCookiesInterceptor클래스는 아래 소스에서 확인 할 수 있습니다.

(SharedPreferences 에 쿠키정보를 저장하고 가져오는 부분은 원하시는 방법으로 편하게 만드시면 됩니다)










그다음 Retrofit을 build해줄때 Custom하게 OkHttpClient를 만들고 이 클라이언트를 Retrofit의 클라이언트로 지정해줍니다.


OkHttpClient client = new OkHttpClient();
// 쿠키를 Prefreence에 저장하고 가져옴
client.interceptors().add(new AddCookiesInterceptor());
client.interceptors().add(new ReceivedCookiesInterceptor());




2.0 이전의 버전을 사용하고 계신다면 위에서 만든 client를 가지고 OkClient 클래스를 만들어주고 이 클라이언트를 RestAdapter에 설정해주시면 됩니다.


OkClient serviceClient = new OkClient(client);








어때요? 참 쉽죠?







이상으로 Retrofit에서 Interceptor를 이용해 쿠키/세션 유지하는 방법(쿠키를 빼돌리기)에 대해 포스팅 해보았습니다.

감사합니다.



Comments