Alamofire Interceptor 사용하기

JiSNG·2020년 8월 31일
3

사수께 예제 받고 공부한 내용을 정리하려고 올립니다 ...
먼저, 공식 문서부터 참고 하는 것을 추천합니다. Adapting and Retrying

Advanced Usage - Interceptor

Interceptor 기능을 사용하려고 합니다.

Interceptor 는 서버에 요청을 보낼 때, 중간에 가로채서 어떤 작업을 한 뒤 다시 서버로 보내는 역할을 합니다.

다른 함수와 달리 직접 호출해서 사용하는 것이 아닌, 구현만 해주면 알아서 작동합니다.

아무튼 저는 토큰 값 갱신을 위해 사용했습니다.

갱신을 위해서 토큰은 token과 refreshToken을 갖고 있어야 합니다.

기존 토큰값이 만료되었을 때, refreshToken 을 통해 토큰을 갱신하기 때문입니다.

그런데 Interceptor는 서버쪽에도 작업이 필요합니다.

만료된 토큰을 받았다면 어떤 상태 코드로 보내줄건지, refreshToken을 받았다면 갱신을 해주는 등 서버 작업도 필요합니다.

클라이언트 혼자 테스트 하기 위해서는 MockLab 이라는 사이트를 사용하면 됩니다.

RequestInterceptor

protocol RequestInterceptor : RequestAdapter, RequestRetrier

구현해야 할 함수는 다음 두 가지입니다.

1. adapt

func adapt(_ urlRequest: URLRequest, for session: Alamofire.Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
  • 가로채서 토큰 넣고 request 합니다.

  • 깃헙 예제처럼 static func authorization(_ value: String) -> HTTPHeader 함수를 사용하여 다음과 같이 쓸 수 있습니다.

    • urlRequest.headers.add(.authorization(bearerToken: accessToken)
  • mutating func addValue(_ value: String, forHTTPHeaderField field: String) 이 함수를 사용할 수도 있습니다.

    • request.addValue(token, forHTTPHeaderField: "token")

2. retry

func retry(_ request: Request, for session: Alamofire.Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)
  • 토큰 만료로 서버에서 에러 코드를 반환할 때 작동

  • AF.request(convertible:interceptor:) 사용, 토큰 갱신하는 서버에다 refreshToken을 넣어서 request

작동 순서

  1. request() : 어디선가 request 호출

  2. adapt() : 서버로 가기 전 가로채서 로컬에 있는 토큰 넣고 보냄

  3. {SERVER} : 토큰 만료, 에러 코드 보냄

  4. retry() : 에러 코드 받음, refresh 토큰 넣고 다시 request (callback)

    1. request()

    2. adapt() : (retry가 갱신을 위해 request 했기 때문에, adapt는 또 나타납니다.)

    3. {SERVER} : refersh 토큰 확인, token/refreshToken 갱신

  5. retry() : (callback) 도착한 토큰을 로컬에 업데이트, request

  6. request()

  7. adapt() : (얘는 retry가 뭐했는지 모릅니다, 그저 언제나 가로채서 로컬 토큰을 넣을 뿐...)

  8. {SERVER} : 성공

profile
JiSNG+iOS

0개의 댓글