Android📱

[Android] Retrofit2 사용 시 헤더에 데이터 넣기!

아무루 2022. 10. 17. 23:30

안드로이드에서 OAuth 2.0 인증 절차를 진행할 때 

okhttp 헤더에 토큰을 추가해서 인증을 진행하는 경우가 많이 있다.

 

나도 프로젝트를 진행하면 보통 서버 측과 JWT를 이용해서 인증을 하고 요청에 대한 응답을 받게 되는 구성으로 프로젝트를 진행하였다.

 

그때 보통 두 개의 방식이 있는데 

 

retrofit2 요청 시 @Header 어노테이션 사용하기

import retrofit2.http.GET

interface ItemApi {
    @GET("/item")
    fun getItemList(
        @Header("accessToken") accessToken: String?,
    ): List<Item>
}

가장 기본 적인 방식은 이 방식이다.

직접 헤더 어노테이션을 써서 토큰을 추가해주는 방식이다.

만약 헤더마다 다른 데이터를 추가해야 하거나

양이 많지 않을 때는 간단하게 사용하기 좋은 방식이라고 생각된다.

 

하지만 토큰은 보통 요청을 할 때 매번 들어가게 되고,

이 작업을 일일이 다 해주다 보면 실수를 할 확률도 있고, 

많은 노동이 들게 된다.

 

그래서 사용하는 방법이

interceptor이다

 

interceptor를 이용해서 헤더 추가하기


import com.example.home_rent_app.data.repository.token.TokenRepository
import com.example.home_rent_app.data.session.AppSession
import kotlinx.coroutines.Dispatchers
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import okhttp3.Route

class AuthInterceptor : Interceptor, Authenticator {

    override fun intercept(chain: Interceptor.Chain): Response {

        val requestBuilder = chain.request()
            .newBuilder()

        requestBuilder.addHeader(
             "access-token",
             it.accessToken.tokenCode
        )
       
        return chain.proceed(requestBuilder.build())
    }
}

이 방식은 okhttp3에 Interceptor라는 인터페이스를 구현하고,

okhttp 클라이언트를 만들 때 추가해주면 자동으로 원하는 내용을 헤더에 추가해주는 방법이다.

 

Builder를 통해서 okhttp 클라이언트를 만들때

.addInterceptor(authInterceptor)

를 이용해서 추가해주면 요청을 보낼 때 자동으로 원하는 내용이 헤더에 추가되게 된다.

그러면 하나하나 @Header를 사용해서 넣지 않아도 일괄적으로 같은 데이터를 넣을 수 있고,

코드를 조금 더 손보면 원하는 내용을 변경하거나, 다른 동작들도 가능하다!