본문 바로가기
개발노트/Android

[Kotlin] : 안드로이드 JWT 토큰 인증 [Retrofit, okHttp3]

by 전지적진영시점 2023. 2. 20.
반응형

안녕하세요 이번 포스팅에서는 JWT토큰과 JWT토큰 인증  구현을 보겠습니다

 

JWT

JSON Web Token (JWT)는 마이크로 서비스의 인증, 인가에 사용할 수 있는 서명된 JSON

 

사용자가 로그인을 하면 토큰을 주는데 서버가 유저를 인증하고 식별하기 위한 토큰 기반 인증 방법입니다.

 

----------------------------------------------------------------------------------------------------

 

1. 사용자가 로그인을 하고
2. 서버에서 토큰이 떨어지고
3. 토큰을 okHttp3 헤더에 , Authorization <- 키값으로 하고 추가 합니다
4. 토큰이 만료되면 서버에서 다시 토큰이 떨어지는데 교체해주면 됩니다 (이 부분은 이번 포스팅에서 진행하지 않습니다@)

토큰을 서버에서 받고 sharePreference혹은 다른 방법으로든 로컬에 저장했다는 가정하에 

포스팅을 진행하겠습니다

 

https://jpointofviewntoe.tistory.com/32

 

1. 먼저 Application()을 상속받는 클래스를 하나 생성해줍니다.

 - manifests 파일에 Application app name에 추가해주세요

 

저는 Common 클래스안에 Preferense를 모아둔 inner class 를 생성했습니다. 

class App : Application() {
    companion object{
        lateinit var prefs: Common.PreferenceUtil
    }
    override fun onCreate() {
        prefs=Common().PreferenceUtil(applicationContext)
        super.onCreate()
    }
}

 

2. 인터셉터를 만들어줍니다.

인터셉터는 Http 요청전에 토큰이 있다면 헤더에 추가해줍니다.

레트로핏 헤더에 어노테이션으로 추가하는 방법도 있지만

토큰과 같은 인증정보처럼 모든 요청의 헤더에 포함되어 있어야하는 정보들은 @Header 어노테이션으로 모든 API에 일일이 토큰 헤더를 붙이는 것은 코드의 중복도 심하고 관리하기도 번거로워 okHttp3 인터셉터를 활용하여 모든 api 요청에 자동으로 토큰을 셋팅해줍니다.

class AuthInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val requeset = chain.request().newBuilder()
            .addHeader("Authorization", App.prefs.getToken() ?: "")
            .build()

        return chain.proceed(requeset)
    }
}

 

3. 마지막으로 OkHttpClient.Builder를 사용하여 만들어진 request를 서버로 요청할 클라이언트를 생성해줍니다.

-addInterceptor에 AuthInterceptor()를 추가해줍니다. 토큰이 생성되면 알아서 넣어줄겁니다!

 

그리고 Retrofit 빌더를 사용하여 셋팅을 마무리해주시면 됩니다. 

val client = OkHttpClient.Builder()
    .addInterceptor(headerInterceptor)
    .addInterceptor(httpLoggingInterceptor)
    .addInterceptor(AuthInterceptor())
    .build()

return Retrofit.Builder()
    .baseUrl(Common.modifyUrlHost())
    .client(client)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()
    .create(ApiService::class.java)

 

이해 안가는 부분이나 제 코드에 문제가 있다면 댓글 부탁드립니다 ! 

반응형

댓글