     ) -> URLSessionDataTask?
 }
 
+class InterceptRedirectDelegate: NSObject, URLSessionTaskDelegate {
+
+    static let shared = InterceptRedirectDelegate()
+
+    func urlSession(_ session: URLSession,
+                    task: URLSessionTask,
+                    willPerformHTTPRedirection response: HTTPURLResponse,
+                    newRequest request: URLRequest,
+                    completionHandler: @escaping (URLRequest?) -> Void) {
+
+        // 303のresponseが返されるようにリダイレクトのrequestはスルーする
+        completionHandler(nil)
+    }
+}
+
 class Client: ClientType {
 
     static let shared = Client()

    private let jsonDecoder: JSONDecoder

    private init(
        session: URLSession = URLSession(configuration: .default),
        callbackQueue: CallbackQueue = CallbackQueue.dispatch(
        DispatchQueue(label: "jp.pay.ios", attributes: .concurrent)),
        jsonDecoder: JSONDecoder = JSONDecoder.shared

                        if let tdsToken = self.createThreeDSecureToken(response: response) {
                            completion?(Result.failure(.requiredThreeDSecure(tdsToken)))
                        } else {
                            completion?(Result.failure(.invalidResponse(response)))
                        }
                    } else {
