본문 바로가기

TIL

[TIL] Alamofire을 이용한 Token 갱신 적용

오늘은 Alamofire를 이용한 토큰(Token) 갱신에 대해 작성해보고자 합니다.

 

RequestInterceptor

Alamofire을 이용하여 토큰 갱신에 대해 구글링해보면 항상 등장하는 키워드는 RequestInterceptor입니다.

Alamofire 공식 문서에 따르면 RequestInterceptorRequestAdapter 프로토콜과 RequestRetrier 프로토콜로 이루어진 프로토콜로 Session별 및 Request별 기능을 제공한다고 정의하고 있습니다. 이와 더불어 RequestInterceptor 프로토콜은 모든 네트워크 요청에 ​​공통 헤더가 추가되고 인증(Authentication) 이 만료되면 요청이 재시도되는 인증 시스템이 포함된다고 합니다.

 

여기서 RequestAdapterRequestRetrier 프로토콜 각각에 대해 간단히 살펴보겠습니다.

  • RequestAdapter: 네트워크 요청 전 URLRequest 를 검사하고 변경할 수 있게 해주는 프로토콜입니다. 이 프로토콜은 주로 요청에 Authorization 헤더를 추가하는 용도로 사용된다고 합니다.
  • RequestRetrier: 이 프로토콜을 사용하면 실행 중에 오류가 발생한 요청을 재시도할 수 있다고 합니다.

 

RequestInterceptor  내부 구조

자 그러면 RequestInterceptor 프로토콜로 토큰 갱신 로직을 구현하기 전에!

RequestInterceptor 프로토콜의 내부적인 구조에 대해 한 번 살펴보겠습니다~

 

아래 사진을 보시면 RequestInterceptor에는 내부적으로 크게 두 메서드가 정의되었습니다. 

1. adapt(_:for:completion:)

Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

 

이 메서드는 지정된 URLRequest를 어떤 방식으로 검사 및 조정하고 결과로 완료 핸들러를 호출한다고 합니다.

따라서 이 메서드에서 주로 헤더에 관한 주입이 이루어진다고 합니다.

2. retry(_:for:dueTo:completion:)

Determines whether the Request should be retried by calling the completion closure.

 

이 메서드는 completion 클로저에 따라 네트워크 요청을 재시도할지 결정해주는 역할을 합니다.

위 사진을 보시면 completion 클로저 인자 타입으로 RetryResult 타입으로 받아오고 있는데요. 바로 이 타입을 외부로 어떻게 반환해주냐에 따라 네트워크 요청 재시도 여부를 결정합니다.

 

다음은 RetryResult 타입에 관한 정의입니다.

RequestInterceptor 내부 구조 기본 흐름

RequestInterceptor 내부 구조 흐름은 다음과 같습니다.

 

RequestInterceptor  구현

이제 실제로 제가 어떻게 구혔했었는지 살펴보겠습니다.

 

 

 

우선 RequestInterceptor 프로토콜을 상속받는 클래스를 선언해줍니다.

 

 

다음으로 adapt(_:for:completion:) 메서드를 구현합니다.

이 메서드에서 Authorization 를 헤더에 넣고 Value 값으로 Access Token을 주입해주었습니다.

 

 

마지막으로 retry(_:for:dueTo:completion:) 메서드를 통해서 Access Token 만료 시 Refresh Token을 통해 갱신하는 로직을 구현하였습니다. 그리고 마찬가지로 Refresh Token 만료 시에는 사용자에게 재로그인을 요청하도록 로직을 구성하였습니다.

 

마무리

사실 더 구글링해보니 Alamofire에서 토큰 갱신 기능 구현에 있어 RequestInterceptor 프로토콜을 뿐만 아니라 Alamofire 5.2부터 도입 된 AuthenticationCredential, Authenticator, AuthenticationInterceptor 프로토콜을 이용해서 구현하는 법도 있다고 하는데요. 

이 부분은 가능하면 추후 시도해볼 생각입니다.

 

여기까지 읽어주셔서 감사합니다.

 

참고 사이트

https://ios-development.tistory.com/730?category=899471

https://siwon-code.tistory.com/72  

https://medium.com/@kyuchul2/ios-alamofire-requestinterceptor-2d7413adf450 

https://velog.io/@maddie/iOS-Alamofire-RxSwift-Interceptor%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9E%90%EB%8F%99-%ED%86%A0%ED%81%B0-%EA%B0%B1%EC%8B%A0-fxzrv8p2

https://ios-development.tistory.com/732

'TIL' 카테고리의 다른 글

[TIL] Combine VS RxSwift  (0) 2024.05.09
[TIL] Swift Concurrency 등장 배경  (0) 2024.05.08
[TIL] TikTok 피드 구현 과정  (0) 2024.04.12
[TIL] Single에 대한 간단 내용 정리  (0) 2024.04.08
[TIL] 스트림 공유  (1) 2024.04.05