면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

OkHttp Authenticator와 Interceptor를 활용한 OAuth 토큰 갱신

skydovesJaewoong Eum (skydoves)||7분 소요

OkHttp Authenticator와 Interceptor를 활용한 OAuth 토큰 갱신

OAuth로 보호되는 API와 통신할 때, 토큰 만료 및 갱신 처리는 네트워킹 계층에서 매우 중요한 부분입니다. 실무에서도 거의 모든 프로젝트에서 마주치는 문제이므로, 면접에서 자주 등장하는 주제이기도 합니다. OkHttp는 이를 위한 두 가지 메커니즘을 제공하는데, 바로 Authenticator 인터페이스와 Interceptor입니다. Authenticator는 서버가 401 인증 실패 응답을 반환했을 때 자동으로 반응하도록 설계된 반면, Interceptor는 요청과 응답 처리 과정 전반에 걸쳐 보다 유연한 제어를 제공합니다. 각 접근법의 적절한 사용 시점과 요청 생명주기(request lifecycle) 내에서의 동작 방식을 이해하는 것은 안정적인 인증 계층을 구축하는 데 필수적입니다.

이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • OkHttp Authenticator가 401 인증 실패에 자동으로 대응하는 방식을 설명할 수 있습니다.
  • 토큰 만료를 감지하고 인라인으로 토큰을 갱신하는 Interceptor를 구현할 수 있습니다.
  • 토큰 관리에서 AuthenticatorInterceptor의 핵심 차이점을 설명할 수 있습니다.
  • 여러 요청이 동시에 토큰 갱신을 유발할 때의 스레드 안전성(thread safety) 문제를 처리할 수 있습니다.

OkHttp Authenticator 사용법

Authenticator 인터페이스는 서버가 401 Unauthorized 상태 코드로 응답할 때 자동으로 호출됩니다. 갱신된 인증 정보를 제공하고, 별도의 코드 작성 없이도 투명하게 요청을 재시도하는 진입점(hook) 역할을 합니다.

class TokenAuthenticator(
    private val tokenProvider: TokenProvider
) : Authenticator {
    override fun authenticate(route: Route?, response: Response): Request? {
        // 토큰 갱신 시도, 실패 시 null 반환으로 재시도 중단
        val newToken = tokenProvider.refreshToken() ?: return null
        return response.request.newBuilder()
            .header("Authorization", "Bearer $newToken")
            .build()
    }
}

authenticate 메서드에서 null을 반환하면 요청 재시도를 중단한다는 의미이며, 새로운 Request 객체를 반환하면 OkHttp가 갱신된 헤더로 요청을 자동 재시도합니다. 클라이언트를 구성할 때는 빌더에 Authenticator를 전달하면 됩니다.

val okHttpClient = OkHttpClient.Builder()
    .authenticator(TokenAuthenticator(tokenProvider))
    .build()

OkHttp는 내부적으로 재시도 횟수를 제한하여 서버가 계속 401을 반환할 때 무한 루프에 빠지는 것을 방지합니다. 기본적으로 최대 20회까지 재시도하도록 되어 있지만, 실무에서는 이 제한만 믿지 말고 직접 재시도 횟수를 관리하는 것이 바람직합니다.

OkHttp Interceptor 사용법

Interceptor는 요청과 응답 파이프라인 전체에 대해 더 정밀한 제어를 제공합니다. 모든 발신 요청에 토큰을 첨부하고, 401 응답이 감지되었을 때 갱신 로직을 수행하는 것이 가능합니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기