운영하고 있는 앱의 기존 버전에서는 리프레시 토큰 없이 액세스 토큰의 유효기간을 24시간으로 설정했기 때문에 하루 단위로 로그인을 다시 해야 하는 불편함이 있었고, 이를 해결하기 위해 버전 2에서 리프레시 토큰을 도입하기로 했다.
사용자가 시도한 액션 API의 반환 상태코드가 401일 경우 액세스 토큰이 만료되었다는 뜻이므로, 그 즉시 리프레시 토큰으로 액세스 토큰을 재발급하는 API를 호출, 재발급된 액세스 토큰으로 기존 시도했던 액션 API를 다시 호출했다. 이 방법이 최선인지는 모르겠으나, 제대로 동작하는 것이 확인되어 기록한다.
첫 시도에서는 AccessViewModel 클래스를 하나 만들고 토큰 재발급이 필요한 모든 클래스에 AcessViewModel을 데리고 다니는 방식으로 구현했으나, 좀 더 간결하고 효율적인 코드를 작성하기 위해 고민하다 싱글톤 패턴을 사용하기로 했다.
토큰 및 상태 관리를 위한 싱글톤 패턴 클래스 구현
상태 매니저 클래스 StateManger
토큰 매니저 클래스 TokenManger
토큰은 민감한 정보이므로 iOS의 keyChain
에 암호화해서 저장, 복호화해서 사용한다.
TokenManager에 추가한 액세스토큰 재발급 로직
액세스 토큰이 필요한 API에 토큰 재발급 로직 추가
예를 들어 카페 정보를 조회하는 API를 호출할 때, 반환 상태코드가 401
이라면 헤더에 붙여서 보낸 토큰이 유효하지 않다(토큰 만료)는 뜻이므로, 401
이 반환되는 case에 refreshAccessToken()
함수를 호출하는 로직을 추가한다.
'iOS' 카테고리의 다른 글
[iOS] [SwiftUI] [TCA] TCA에 대해 알아보고 간단한 튜토리얼을 완료해보자 (0) | 2023.12.16 |
---|---|
[SwiftUI] [Combine] [MVVM] Apple OAuth 소셜 로그인 구현하기 (0) | 2023.12.16 |