[Android] Access vs Refresh 토큰 정리

도톨이·2024년 10월 30일

Kotlin

목록 보기
5/10
post-thumbnail

카테캠 프로젝트에서 카카오 로그인을 구현하던 중, 액세스 토큰과 리프레시 토큰이 있어 이 개념을 정리하고 가보려고 한다.

Access Token

액세스 토큰은 사용자에 대한 정보를 담고 있어서 서비스에 접근(Access)할 수 있는 토큰이다.

  • 제한된 시간 동안 유효
  • 서버가 사용자가 인증된 상태임을 확인할 수 있음
  • 사용자 데이터에 직접 접근하고 API 호출에 사용
  • 보안성을 위해 짧은 수명을 가지고 있으며, 주기적으로 갱신이 필요
    => 앱에 접근하는 입장권

Refresh Token

새로운 액세스 토큰을 생성하는 용도의 토큰

  • 토큰이 만료되었을 때 새로운 액세스 토큰 발급하기 위한 용도로 액세스 토큰보다 더 긴 유효 기간
  • 새로운 액세스 토큰을 발급받기 위한 용도로 사용됨
    => 입장권 발급을 위한 증빙자료 같은. 이게 있으면 입장권을 다시 발급받을 수 있다!

안드로이드 프로젝트에서 두 토큰을 효과적으로 관리하는 방법

안드로이드에서 토큰을 관리할 때 SharedPreferences, KeyStore, DataStore 3가지가 있는데 SharedPreferences 을 사용하는 방법은 암호화가 되어 있지않아 요즘 토큰을 저장하는데 잘 사용하지 않는다고 한다.
그렇지만, 연습 중이기 때문에 우리 프로젝트에서는 SharedPreferences을 사용하였다.

SharedPreferences

  • 간단하게 키-값 형태로 데이터를 저장할 수 있는 저장소
  • 기본적으로 암호화가 되어있지 않아 보안에 취약할 수 있음

KeyStore

  • 안드로이드에서 제공하는 보안 저장소로, 민감한 정보를 암호화하여 저장할 수 있음.
  • 키를 생성하고 관리하며, 직접적으로 토큰 데이터를 저장하기보다는, 암호화를 위해 생성한 키를 SharedPreferences와 같은 저장소와 함께 사용하는 방식으로 활용 가능

DataStore

  • SharedPreferences의 단점을 보완하기 위해 나온 Jetpack의 라이브러리
  • Preferences DataStore: SharedPreferences와 비슷한 방식으로 Key-Value 형태의 데이터를 저장하며, 보안이 필요한 경우 암호화하여 사용 가능
  • Proto DataStore: 데이터 클래스와 프로토콜 버퍼를 사용해 데이터를 저장함

SharedPreference 를 사용하면 다음처럼 토큰을 저장할 수 있다auth_prefs 라는 sharePref 를 가져와서 String 을 넣는다! ACCESS_TOKEN 이라는 키에는 액세스토큰 넣고, REFRESH_TOKEN 라는 키에는 리프레시 토큰을 넣는다.

fun saveTokens(accessToken: String, refreshToken: String) {
    val sharedPref = context.getSharedPreferences("auth_prefs", Context.MODE_PRIVATE)
    with(sharedPref.edit()) {
        putString("ACCESS_TOKEN", accessToken)
        putString("REFRESH_TOKEN", refreshToken)
        apply()
    }
}

그리고, 가져올 땐 이런식으로 가져오는 함수를 만들 수 있을 것이다. auth_prefs SharedPref 를 가져온 후 ACCESS_TOKEN 이라는 키에 있는 String 을 가져와서 리턴하도록 하거나 REFRESH_TOKEN 라는 키에 있는 String 을 가져와서 리턴하게 할 수 있다.

fun getAccessToken(): String? {
    val sharedPref = context.getSharedPreferences("auth_prefs", Context.MODE_PRIVATE)
    return sharedPref.getString("ACCESS_TOKEN", null)
}

fun getRefreshToken(): String? {
    val sharedPref = context.getSharedPreferences("auth_prefs", Context.MODE_PRIVATE)
    return sharedPref.getString("REFRESH_TOKEN", null)
}

참고 자료

[Android & Kotlin] SharedPreferences + JWT Token을 이용해 서버와 통신, 로그인 구현하기 (Feat. Bearer JWT, Bearer 토큰)

https://rivermoon99.tistory.com/28

profile
Kotlin, Flutter, AI | Computer Science

0개의 댓글