위 처럼 Retrofit의 Header를 사용하면 JWT토큰을 헤더로 보낼 수 있지만 매 API 마다 작성해야 하므로 번거로움이 있습니다. 이를 개선하기 위해 InterCeptor를 통해 request시 jwt를 전달할 수 있습니다.
Interceptor는 해당 네트워크 통신을 하는 중간에 요청과 응답을 보내거나 받거나 간섭하는 역할을 수행합니다.
Interceptor 클래스를 만들어서 저장해둔 JWT를 가져와서 request의 addHeader를 사용해 JWT 토큰을 헤더에 넣어줍니다.
class XAccessTokenInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
//JWT 가져오기
var token = TOKEN
val request = chain.request()
.newBuilder()
.addHeader("JWT", "$token")
.build()
val response = chain.proceed(request)
return response
}
}
이 인터셉터를 OkHttpClient에 추가해주고 Retrofit에 client로 등록해줍니다
@Provides
@Singleton
fun provideOkHttpClient(
xAccessTokenInterceptor: XAccessTokenInterceptor
): OkHttpClient {
return OkHttpClient.Builder()
.addNetworkInterceptor(xAccessTokenInterceptor)
.build()
}
@Provides
@Singleton
fun provideRetrofitInstance(gson: Gson, client: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build()
}
이제 Interceptor로 API에 일일이 Header에 JWT를 넣어 줄 필요 없이 Interceptor를 통해 JWT를 전달할 수 있습니다.