오늘의 공부는?!/Android

[Android]OkHttp Interceptor를 이용해 헤더에 토큰 붙이기(Kotlin)

꼬물쥰 2023. 2. 10. 00:58

프로젝트를 진행하면서 jwt 인증을 이용하게 되었다.

사실 내가 할 건 별로 없긴한데, 시나리오를 한번 정리해보겠다.

 

1. 회원가입 후 로그인을 하면 서버에서 accessToken과 refreshToken을 발급해준다.

2. 이 토큰을 가지고 api call에 사용한다.

    -> 회원정보 수정이나 정보조회 등,,

3. api call할때, 추가로 헤더에 accessToken을 넣어서 request 보내야 함.

    ->  이때, "Bearer ${token}" 형식으로 보내야 함.

4. 만약 accessToken이 만료되었다면 서버에서는 403코드를 보낼것임

5. 403을 받으면 refreshToken을 포함하여 call 보내서 Token을 재발급 해야함.

 

대충 정리하긴 했는데 이런 시나리오다.

 

//retrofit 인터페이스
@POST("auth/check-password")
fun checkPassword(
	@Header("Authorization") token: String,
	@Body params: HashMap<String, String>,
): Call<ResultResponse>


//retrofit 사용하여 api call
    private fun checkPassword() {
        val currentPassword = HashMap<String, String>()
        currentPassword["password"] = binding.editCurrentPassword.text.toString()
        val tok = "Bearer " + MyApplication.prefs.getString("accessToken")
        service.checkPassword(
            tok, currentPassword
        ).enqueue(object : Callback<ResultResponse> {
            override fun onResponse(
                call: Call<ResultResponse>,
                response: Response<ResultResponse>
            ) {
                val body = response.body()
                if (body != null) {
                    if (body.statusCode == 200) {
                        intentPage(ModifyPwActivity::class.java)
                    } else {
                        errorMessageDialog(body.message)
                        binding.editCurrentPassword.text = null
                    }
                }
            }

            override fun onFailure(call: Call<ResultResponse>, t: Throwable) {
                Log.e("checkPassword fail", "[Fail]$t")
            }
        })
    }

지금까지는 위의 코드처럼 retrofit 인터페이스에 하나하나 token을 붙여서 보내는 방식이었다.

메소드 수가 많아질수록 저 같은 코드를 여러번 반복하는게 귀찮고 거슬렸다.

그래서 이걸 어떻게 해결할지 좀 찾아보다가 Interceptor라는 것을 발견했다.

 

Interceptor는 말그대로 가로채는 것인데,

Interceptor를 이용하면 request 요청이나 response를 받을 때

interceptor가 가로채서 헤더를 추가하거나, 요청에 대한 응답을 처리할 수 있다.

내가 쓴 말이 이해가 안될 것 같아서 다른 분이 작성하신 것을 추가해보겠다....ㅎ

Interceptors란 API 통신에서 요청에 대해 monitor, rewrite 그리고 retry 할 수 있는 강력한 메커니즘이다. Interceptor를 통해서 우리는 API 통신을 만들 때, 통신 과정을 모니터링 하거나 특별한 작업을 수행할 수 있다. 쉽게 말해서, Interceptor 기능은 공항 보안 요원이 보안 검사하는 과정과 비슷하다. 그들은 먼저 탑승권을 확인하고, 승인한 다음에서야 우리가 지나갈 수 있도록 하는 것처럼 말이다.
Interceptor는 중앙에서 API 호출들을 모니터링 하는 것처럼 다양하게 사용된다. 일반적으로 우리는 각각의 network 호출에 대해 logger를 달아야 할 필요가 있다. 하지만 Interceptor를 이용한다면 하나의 logger를 추가하여 모든 network 호출에 대해 동작하도록 할 수 있다. 다른 경우로는 offline-first app의 build를 위해 network 요청의 response를 캐싱하기도 한다.

 

 

//구현한 거 추가하기,,!

 

자세한 코드는 깃허브 링크 남기겠습니다.

GitHub

 

GitHub - Management-Of-Staff/client: 사장님 매장 관리 어플리케이션 Android

사장님 매장 관리 어플리케이션 Android. Contribute to Management-Of-Staff/client development by creating an account on GitHub.

github.com

 

 

참고

https://devgeek.tistory.com/56