Android

쿠키로 Auth인증하는 방법 (Interceptor 첨부)

그란. 2022. 2. 12. 18:13

통신할때 Auth인증하는 방법중에 쿠키에 (헤더에) 인증값을 넣어 통신하는 방법

 

로그인또는 회원가입했을때 Response Header에 

set-cookie

해당 키값을 찾아 value 를 저장해놓고 ( SharedPreferences ) 

 

Auth가 필요한 통신을 할때 저장된 value를 Request Header에 넣어 통신하는 방법

 

 

Retrofit Interceptor 첨부 

internal class AuthInterceptor @Inject constructor(
    private val sessionProvider: SessionProvider
) : Interceptor {

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {

        val response = this.doRequest(chain)

        if (response.code == HttpURLConnection.HTTP_UNAUTHORIZED) {
            sessionProvider.logout()
            return response
        }

		//value 값중 필요한 값만 가져오기  
        response.headers(HEADER_RESPONSE_COOKIE).takeIf { it.isNotEmpty() }?.let { cookies ->
            val sid = cookies.first().substringBefore(";").substringAfter("=")
            sessionProvider.updateAccessToken(sid)
        }

        return response
    }

    @Throws(IOException::class)
    private fun doRequest(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val cookieSid = sessionProvider.cookieSid
        if (cookieSid != null) {
            return chain.proceed(
                request
                    .newBuilder()
                    .addHeader(HEADER_REQUEST_COOKIE, "$SID_PREFIX$cookieSid")
                    .build()
            )
        }
        return chain.proceed(request)
    }

    companion object {
        private const val HEADER_RESPONSE_COOKIE = "set-cookie"
        private const val HEADER_REQUEST_COOKIE = "Cookie"
        private const val SID_PREFIX = "xxx.sid="   // 서버 설정에 따라 다를 수 있음
    }
}