[swift] Swift Moya에서 인증 토큰 갱신하기

Moya는 Swift 언어로 작성된 네트워킹 라이브러리로, 네트워크 호출을 단순화하고 인터페이스를 추상화하여 개발자들에게 편의성을 제공합니다. 이 블로그 포스트에서는 Moya를 사용하여 API 호출 중에 만료된 인증 토큰을 자동으로 갱신하는 방법을 알아보겠습니다.

Moya와 Alamofire 설치하기

Moya를 사용하기 위해서는 우선 Moya를 설치해야 합니다. Moya는 Alamofire의 기능을 래핑한 것이므로, Alamofire도 함께 설치해야 합니다. Cocoapods을 사용한다면, Podfile에 다음과 같이 작성하여 라이브러리를 설치합니다.

pod 'Moya'
pod 'Alamofire'

설치가 완료되면, 프로젝트를 업데이트하여 변경된 종속성을 가져옵니다.

TokenRenewable 타입 추가하기

Moya에서 인증 토큰을 갱신하기 위해서는 Moya.Provider의 동작을 재정의해야 합니다. 이를 위해 TokenRenewable이라는 프로토콜을 추가합니다. 이 프로토콜은 현재 토큰이 유효한지 확인하고, 만료된 토큰이라면 토큰을 갱신하는 데 필요한 메서드와 프로퍼티를 정의합니다. 예시 코드는 다음과 같습니다.

protocol TokenRenewable {
    var token: String? { get set }
    func isTokenValid() -> Bool
    func renewToken(completion: @escaping (String?, Error?) -> Void)
}

TokenRenewable을 사용하여 Provider 구현하기

TokenRenewable을 사용하여 Moya.Provider를 구현하기 위해서는 MoyaProvider를 상속받은 커스텀 클래스를 생성해야 합니다. 이 클래스에서는 Moya를 사용하는 기능들을 재정의하여 인증 토큰을 갱신하는 로직을 추가합니다. 아래는 예시 코드입니다.

import Moya

class TokenRenewableProvider<Target: Moya.TargetType & TokenRenewable>: MoyaProvider<Target> {

    override func request(_ target: Target, callbackQueue: DispatchQueue? = .none, progress: ProgressBlock? = .none, completion: @escaping Completion) -> Cancellable {

        if !target.isTokenValid() {
            target.renewToken { newToken, error in
                if let token = newToken {
                    self.token = token
                    super.request(target, callbackQueue: callbackQueue, progress: progress, completion: completion)
                } else {
                    completion(.failure(error ?? TokenRenewalError.unknown))
                }
            }
        } else {
            super.request(target, callbackQueue: callbackQueue, progress: progress, completion: completion)
        }

        return super.request(target, callbackQueue: callbackQueue, progress: progress, completion: completion)
    }
}

TokenRenewableProvider 사용하기

이제 TokenRenewableProvider를 사용하여 API 호출을 수행해보겠습니다. 아래는 예시 코드입니다.

struct APIService: TargetType, TokenRenewable {
    var token: String?

    // ... TargetType 프로토콜 구현

    func isTokenValid() -> Bool {
        // 토큰의 유효성을 검사하여 유효하다면 true, 그렇지 않다면 false를 반환
    }

    func renewToken(completion: @escaping (String?, Error?) -> Void) {
        // 토큰 갱신 로직을 구현
    }
}

let provider = TokenRenewableProvider<APIService>()
provider.request(.getUserInfo) { result in
    switch result {
    case .success(let response):
        // 응답 처리 로직
    case .failure(let error):
        // 에러 처리 로직
    }
}

예시 코드에서는 APIService라는 API 타겟을 정의하고, TokenRenewable 프로토콜을 구현합니다. 그리고 TokenRenewableProvider를 사용하여 API 호출을 수행합니다. 호출된 API는 자동으로 인증 토큰을 갱신하게 됩니다.

결론

이렇게 Moya와 TokenRenewable 프로토콜을 활용하여 인증 토큰을 갱신하는 방법에 대해 알아보았습니다. Moya를 사용하면 네트워크 호출을 효율적이고 간결하게 관리할 수 있으며, 인증 토큰을 자동으로 갱신하는 기능을 추가하여 보안을 강화할 수 있습니다.