JSON Web Token의 약자로 안정성 있게 데이터를 교환하기 위해 사용합니다.
로그인 시 서버에서 토큰을 발급받고 정보를 주고 받을 때 헤더에 토큰을 사용하여 데이터를 주고 받습니다.
간단한 설정 값을 앱 내부의 DB에 저장하기 용이한 내부 저장소입니다. (앱 삭제시 데이터도 소거됩니다)
class Prefs(context: Context) {
private val prefNm="mPref"
private val prefs=context.getSharedPreferences(prefNm,MODE_PRIVATE)
}
var token:String?
get() = prefs.getString("token",null)
set(value){
prefs.edit().putString("token",value).apply()
}
class App :Application(){
companion object{
lateinit var prefs:Prefs
}
override fun onCreate() {
prefs=Prefs(applicationContext)
super.onCreate()
}
}
<application android:name="com.example.App" ... </application>
// 토큰 저장하기
App.prefs.token=token
// 토큰 가져오기
val token = App.prefs.token
이제 Shared Preference를 사용하여 발급받은 토큰을 저장할 수 있게 되었습니다.
retrofit의 @Header 어노테이션을 사용하여 저장된 토큰을 헤더에 넣을 수 있습니다.
일일히 retrofit 메서드에 토큰을 부여할 수 있지만 메서드의 양이 많아지면 귀찮아집니다.
OkHttp3의 Interceptor를 사용하면 REST API를 요청할 때 Interceptor가 요청을 가로채(intercept) 헤더를 붙인 뒤 다시 전송해줍니다.
class AuthInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
var req =
chain.request().newBuilder().addHeader("Authorization", App.prefs.token ?: "").build()
return chain.proceed(req)
}
}
Interceptor를 상속받아 intercept 메서드를 구현합니다.
chain에 "Authorization"이라는 key와 prefs의 value를 가진 헤더를 붙인 뒤 return해줍니다.
val okHttpClient = OkHttpClient.Builder().addInterceptor(AuthInterceptor()).build()
만들어 놓은 interceptor를 바탕으로 okHttpClient를 생성합니다.
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create()).build()
}
retorit의 인스턴스를 생성할 때 client를 연결해줌으로써 OkHttp3 Interceptor를 사용하는 과정이 끝났습니다.
이제 프로젝트를 진행할 때 편하게 JWT 인증 방식을 사용할 수 있게 되었습니다!