[Android] HTTP 통신 시 Retrofit2로 헤더에 자동으로 토큰 전송하기

2021. 11. 24. 00:00·Android
Android Studio 4.2.2
Android SDK 28
Kotlin 1.5.21

 

 

도입

HTTP 통신을 할 때, 유효한 사용자임을 증명하는 정보를 헤더에 넣어 요청해야 하는 경우가 많다.

예를 들어 로그인을 했다면 유저정보가 담긴 토큰을 헤더에 넣어 로그인한 유저라는 정보를 보내는 것이다.

 

이 동작은 레트로핏 객체를 생성할 때 자동으로 헤더에 토큰 정보를 넣는 OkHttp클라이언트를 추가하면 된다.

XAccessTokenInterceptor

shared preference에 X-ACCESS-TOKEN이란 키값으로 저장되어있는 토큰을 헤더에 추가하는 Interceptor 클래스

class XAccessTokenInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val builder = chain.request().newBuilder()
        val jwtToken: String? =
            App.sSharedPreferences.getString(App.X_ACCESS_TOKEN, null)

        if (jwtToken != null) {
            builder.addHeader(App.X_ACCESS_TOKEN, jwtToken)
        }
        return chain.proceed(builder.build())
    }
}

shared preference 객체인 sSharedPreferences는 Application 클래스를 상속받는 App 클래스에서 초기화한 상태이다.

class App : Application() {

    companion object { // 자바에서 static 처럼 사용할 수 있는 변수 및 함수
        
        // SharedPreferences 관련 문자열
        val SP_TAG = "LINKAIVE_APP"
        val X_ACCESS_TOKEN = "X-ACCESS-TOKEN"

        // SharedPreferences 객체
        lateinit var sSharedPreferences: SharedPreferences

    }


    override fun onCreate() {
        super.onCreate()

        // sp 객체 초기화
        sSharedPreferences = applicationContext.getSharedPreferences(SP_TAG, Context.MODE_PRIVATE)

    }
    
}

OkHttpClient 및 Retrofit 객체 생성

OkHttpClient 객체를 만들 때 addNetworkInterceptor() 메소드를 사용해 Interceptor 객체를 세팅한다.

Retrofit 객체를 만들 때에는 client() 메소드로 OkHttpClient 객체를 세팅한다.

class App : Application() {

    companion object { // 자바에서 static 처럼 사용할 수 있는 변수 및 함수
    
        ...
        
        // Retrofit 인스턴스
        lateinit var retrofit: Retrofit

        var gson = GsonBuilder().setLenient().create()


        @JvmName("getRetrofit1")
        fun getRetrofit(): Retrofit {

            if (!this::retrofit.isInitialized) {
                val client = OkHttpClient.Builder()
                    .readTimeout(50000, TimeUnit.MILLISECONDS) // 5000
                    .connectTimeout(50000, TimeUnit.MILLISECONDS) // 5000
                    .addNetworkInterceptor(XAccessTokenInterceptor()) // JWT 자동 헤더 전송
                    .build()
                retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build()
            }
            return retrofit
        }

    }
    
    ...
}
728x90
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] RecyclerView CRUD  (0) 2022.10.22
[Android] RecyclerView 사용법  (0) 2022.10.22
[Android] 레트로핏(Retrofit2) 사용법  (0) 2021.11.21
[Android] 직접 만든 안드로이드 프로젝트 템플릿  (0) 2021.11.18
[Android] 권한 확인 및 요청  (0) 2021.11.15
'Android' 카테고리의 다른 글
  • [Android] RecyclerView CRUD
  • [Android] RecyclerView 사용법
  • [Android] 레트로핏(Retrofit2) 사용법
  • [Android] 직접 만든 안드로이드 프로젝트 템플릿
Wintinue
Wintinue
201 Created!
  • Wintinue
    Win Record
    Wintinue
    • 📘 Post (68)
      • Android (32)
      • Nest.js (1)
      • NGINX (1)
      • Error (10)
      • AWS (1)
      • Git (3)
      • IT용어 (4)
      • CMD (2)
      • Language (5)
        • PHP (3)
        • Java (2)
      • Project (5)
        • 개인 프로젝트 (3)
        • 팀 프로젝트 (2)
  • 링크

    • Github
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.3
Wintinue
[Android] HTTP 통신 시 Retrofit2로 헤더에 자동으로 토큰 전송하기
상단으로

티스토리툴바