안드로이드에서 JWT 사용하기

이형진·2021년 6월 7일
6

안드로이드

목록 보기
2/3
post-thumbnail

JWT

JSON Web Token의 약자로 안정성 있게 데이터를 교환하기 위해 사용합니다.

로그인 시 서버에서 토큰을 발급받고 정보를 주고 받을 때 헤더에 토큰을 사용하여 데이터를 주고 받습니다.

안드로이드에서의 JWT 사용과정

  1. 아이디 비밀번호 등을 통해 사용자가 로그인을 함
  2. 서버에서 토큰(access token)을 발급
  3. 토큰을 저장소(preference ... )에 저장
  4. 서버에 요청할 때 저장소의 토큰을 header에 넣어 요청함

Shared Preference

간단한 설정 값을 앱 내부의 DB에 저장하기 용이한 내부 저장소입니다. (앱 삭제시 데이터도 소거됩니다)

사용방법

  1. Preference Class 생성 후 preference 인스턴스를 생성합니다.
class Prefs(context: Context) {
    private val prefNm="mPref"
    private val prefs=context.getSharedPreferences(prefNm,MODE_PRIVATE)
}
  1. get set 메서드를 통해 관리합니다.
var token:String?
    get() = prefs.getString("token",null)
    set(value){
        prefs.edit().putString("token",value).apply()
    }
  1. 효율적인 자원관리를 위해 싱글톤 패턴을 사용하고 가장 먼저 실행되기 위해 Application을 상속받은 class에서 onCreate 전에 초기화해줍니다.
class App :Application(){
    companion object{
        lateinit var prefs:Prefs
    }
    override fun onCreate() {
        prefs=Prefs(applicationContext)
        super.onCreate()
    }
}
  1. manifast에서 application을 등록합니다
<application android:name="com.example.App" ... </application>
  1. Shared Preference에서 토큰을 저장하고 가져올 수 있습니다
// 토큰 저장하기
App.prefs.token=token
// 토큰 가져오기
val token = App.prefs.token

이제 Shared Preference를 사용하여 발급받은 토큰을 저장할 수 있게 되었습니다.

retrofit의 @Header 어노테이션을 사용하여 저장된 토큰을 헤더에 넣을 수 있습니다.

OkHttp3 Interceptor 사용하기

일일히 retrofit 메서드에 토큰을 부여할 수 있지만 메서드의 양이 많아지면 귀찮아집니다.

OkHttp3의 Interceptor를 사용하면 REST API를 요청할 때 Interceptor가 요청을 가로채(intercept) 헤더를 붙인 뒤 다시 전송해줍니다.

사용방법

  1. Interceptor 생성
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해줍니다.

  1. Client 생성
val okHttpClient = OkHttpClient.Builder().addInterceptor(AuthInterceptor()).build()

만들어 놓은 interceptor를 바탕으로 okHttpClient를 생성합니다.

  1. Client와 retrofit의 인스턴스를 연결
val retrofit: Retrofit by lazy {
            Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()).build()
        }

retorit의 인스턴스를 생성할 때 client를 연결해줌으로써 OkHttp3 Interceptor를 사용하는 과정이 끝났습니다.

이제 프로젝트를 진행할 때 편하게 JWT 인증 방식을 사용할 수 있게 되었습니다!

0개의 댓글