스위프트를 사용하여 웹 서비스에 요청을 보낼 때, 종종 요청을 인증해야 합니다. 이를 위해 자주 사용되는 라이브러리 중 하나는 아폴로(Apollo)입니다. 이 블로그 포스트에서는 스위프트 아폴로에서의 요청 인증 방법에 대해 알아보겠습니다.
1. 헤더에 토큰 추가하기
요청을 보낼 때, 일반적으로 토큰을 헤더에 추가하여 인증을 처리합니다. 스위프트 아폴로에서는 HTTPInterceptorProvider
를 사용하여 모든 요청에 헤더를 추가할 수 있습니다. 아래는 예시입니다.
import Apollo
import ApolloWebSocket
let interceptorProvider = LegacyInterceptorProvider(store: apolloStore, shouldPersistQueries: true, storeQueue: storeQueue)
interceptorProvider.addInterceptor(MyAuthInterceptor())
MyAuthInterceptor
는 HTTPRequestInterceptor
프로토콜을 채택한 사용자 정의 인터셉터입니다. 이 인터셉터에서 헤더에 토큰을 추가할 수 있습니다.
2. 토큰 캐싱 및 갱신
토큰은 일반적으로 만료되기 때문에, 토큰을 캐싱하고 갱신하는 로직을 구현해야 합니다. 아래는 토큰을 캐싱하고 갱신하는 예시입니다.
class TokenManager {
static let shared = TokenManager()
private var token: String?
func getToken(completion: @escaping (String?) -> Void) {
if let token = token, !isExpired(token) {
// 캐시된 토큰이 있고, 만료되지 않은 경우
completion(token)
} else {
// 토큰을 새로 발급받아 캐싱
refreshToken { newToken in
self.token = newToken
completion(newToken)
}
}
}
private func refreshToken(completion: @escaping (String?) -> Void) {
// 토큰 갱신 로직 구현
// 새로운 토큰을 completion으로 전달
// 로그인 정보나 기타 필요한 파라미터를 사용하여 서버에 요청
}
private func isExpired(_ token: String) -> Bool {
// 토큰의 만료 여부를 체크하는 로직 구현
}
}
위의 코드에서 getToken
함수는 캐시된 토큰이 유효한지 확인하고, 만료되었다면 새로운 토큰을 발급받아 캐시하고 반환합니다.
3. 요청 시 토큰 활용하기
인증된 토큰을 통해 요청을 보내려면, 아폴로 클라이언트를 생성할 때 토큰을 사용하여 설정해야 합니다. 아래는 예시입니다.
import Apollo
import ApolloWebSocket
let websocket = WebSocketTransport(url: websocketURL)
let apolloClient = ApolloClient(networkTransport: websocket, store: apolloStore, shouldAutoPersist: true)
TokenManager.shared.getToken { token in
if let token = token {
apolloClient.clientIdentifier = token
apolloClient.additionalHeaders = ["Authorization": "Bearer \(token)"]
}
}
위의 코드에서 TokenManager.shared.getToken
함수를 사용하여 토큰을 가져온 후, 클라이언트를 생성하고 추가적인 헤더를 설정합니다.
결론
스위프트 아폴로를 사용하여 웹 서비스에 요청을 보낼 때 토큰 인증을 구현하는 방법에 대해 알아보았습니다. 토큰을 헤더에 추가하고, 캐싱하고 갱신하며, 요청 시 토큰을 활용하는 방법을 살펴보았습니다. 이러한 방법을 활용하여 보다 안전하고 신뢰할 수 있는 웹 서비스 요청을 구현할 수 있습니다.
참고 문서: