[Android] Retrofit + CookieJar를 이용한 쿠키 유지

Minji Jeong·2022년 5월 15일
2

Android

목록 보기
14/37
post-thumbnail
Retrofit을 이용해 로그인을 구현하면서 쿠키, 세션, 토큰 등에 대한 개념의 필요성을 느꼈고, 따라서 포스팅을 남긴 적이 있었다. 해당 포스팅을 남기면서 access token은 유효기간이 너무 짧기 때문에 refresh token을 이용해 access token을 새로 발급받아야 한다는 것을 깨달았고, response 헤더 부분에서 refresh token을 따로 파싱해서 가져온 후 로컬 스토리지에 저장해서 요청할 때마다 헤더에 보내면 된다고 생각했는데 잘 안되는 것이다 🤣 열심히 삽질하던 중에 'CookieJar'라는 것을 사용하면 간편하게 쿠키를 유지할 수 있다는 것에 대해 알게 되었는데, CookieJar를 사용한 쿠키 유지 방법에 대해 공부도 할 겸 이렇게 글을 쓰게 되었다.

CookieStore? Interceptor? CookieJar?

Retrofit을 사용해 안드로이드 상에서 쿠키를 유지하는 데는 크게 CookieStore, Interceptor, CookieJar가 있다. CookieStore를 사용하면 앱을 실행하고 로그인 한 뒤 이루어지는 모든 Request에 대해서 쿠키를 유지할 수 있기 때문에 계속 로그인된 사용자임을 알려줄 수 있다. 하지만 context에 의존적이기 때문에, 앱의 process가 완전 종료되면 로그인이 풀리고 따라서 앱을 새로 실행할 때마다 다시 쿠키를 발급받아야 하는 단점이 있다.

반면에 Interceptor를 사용하면 OkHttp를 사용해 실행시마다 항상 같은 쿠키값을 유지할 수 있다. 서버 응답으로부터 쿠키 정보를 가져와 로컬 스토리지에 저장하고, 서버 요청 시마다 로컬 스토리지에 저장되어있는 쿠키값을 헤더에 넣어주는 2개의 클래스를 만들어주면 된다.

하지만 Interceptor 역시 코드 양이 길어지고 복잡해진다는 단점이 있다. 이 모든 단점을 우리는 CookieJar로 보완할 수 있다.

CookieJar

👉 CookieJar document

CookieJar는 OkHttp에서 제공하는 인터페이스로, CookieJar를 사용하면 클래스를 따로 만들 필요 없이 OkHttpClient만 만들어주면 되기 때문에 Interceptor보다 더 간결한 코드로 쿠키를 유지할 수 있다. 먼저 CookieJar를 사용하기 위해선 build.gradle(module)에 해당 라이브러리를 추가해야한다.

implementation "com.squareup.okhttp3:okhttp-urlconnection:4.9.1"

다음으로 cookieJar(JavaNetCookieJar(CookieManager()))를 통해 OkHttpClient 생성 시에 쿠키매니저를 연결시키면 끝이다. 이렇게 되면 서버 요청 시 retrofit이 알아서 해당 쿠키를 포함해 요청하기 때문에 별도의 로컬 스토리지에 쿠키를 저장할 필요가 없다.

object NetworkClient {

    var builder = OkHttpClient().newBuilder()
    var okHttpClient = builder
        .cookieJar(JavaNetCookieJar(CookieManager()))
        .build()


    val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
}

만약 OkHttp 객체가 여러개일 경우엔(보통 Retrofit을 사용하면 OkHttpClient가 연결된 싱글톤 타입의 Retrofit 객체를 공유해서 사용하기 때문에, OkHttp 객체가 여러개인 경우는 거의 없을 것이다) 쿠키를 공유할 수 있도록 CookieJar의 동일한 인스턴스를 모든 OkHttpClient에 설정해야한다.

이 방법을 사용하면 최초 로그인 시 발급받은 쿠키 내의 refresh token으로 access token을 매번 새로 발급받아 로그인을 유지할 수 있다. 기존의 Interceptor를 사용하는 것보다 훨씬 간단하기 때문에, 로그인 상태를 유지하고 싶다면 Interceptor보단 CookieJar를 사용하는 것을 추천한다.

References

https://stackoverflow.com/questions/45207012/when-using-cookies-in-okhttp3-does-a-cookiejar-have-any-performance-benefits-ove
https://modelmaker.tistory.com/entry/Android-Okhttp-Interceptor%EB%A1%9C-%EC%9B%90%ED%95%98%EB%8A%94-%EC%9D%91%EB%8B%B5%EC%9C%BC%EB%A1%9C-%EB%B3%80%ED%98%95%ED%95%98%EA%B8%B0%EC%99%80-Interceptor-Test?category=758157?category=758157
https://0391kjy.tistory.com/62
https://two22.tistory.com/35

profile
Flutter Developer

0개의 댓글