[Android]OkHttp Interceptor를 이용해 헤더에 토큰 붙이기(Kotlin)
프로젝트를 진행하면서 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 - Management-Of-Staff/client: 사장님 매장 관리 어플리케이션 Android
사장님 매장 관리 어플리케이션 Android. Contribute to Management-Of-Staff/client development by creating an account on GitHub.
github.com
참고