[IOS] URLSession 토큰이 만료되었을 경우, Refresh Token을 사용하여 토큰을 갱신하는 방법

iOS 앱에서 API 요청 시 토큰이 만료되었을 경우, Refresh Token을 사용하여 토큰을 갱신하는 방법은 다음과 같습니다:

  1. Refresh Token 요청: 만료된 토큰을 대체할 새로운 액세스 토큰을 얻기 위해 Refresh Token을 사용하여 백엔드 서버에 요청합니다. 이를 위해 앱은 Refresh Token과 함께 특정 엔드포인트를 호출해야 합니다.

  2. 백엔드 서버 처리: 백엔드 서버는 앱에서 보낸 Refresh Token을 검증하고, 유효한 경우 새로운 액세스 토큰을 생성하여 응답으로 보냅니다.

  3. 새로운 토큰 사용: 앱은 백엔드 서버로부터 받은 새로운 액세스 토큰을 저장하고, 이후 모든 API 요청에 해당 토큰을 사용합니다.

iOS 앱 내에서 이를 구현하는 방법은 다양할 수 있습니다. 일반적으로는 네트워크 요청을 처리하는 HTTP 라이브러리나 URLSession과 같은 기술을 사용하여 백엔드 서버와 통신하고, 토큰의 유효성을 검사하여 만료되었다면 자동으로 Refresh Token 요청을 보내고 새로운 토큰을 받아오는 로직을 구현합니다.

간단한 예시를 보겠습니다 (Swift 기준):

func makeAPICall(with token: String) {
    // 네트워크 요청을 보내는 코드 (예시를 위해 간단하게 작성합니다)
    let urlString = "https://api.example.com/data"
    guard let url = URL(string: urlString) else { return }
    
    var request = URLRequest(url: url)
    request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        if let httpResponse = response as? HTTPURLResponse {
            if httpResponse.statusCode == 401 { // 토큰 만료 시
                // Refresh Token 요청을 보내는 코드 (다시 예시를 위해 간단하게 작성합니다)
                refreshAccessToken { newToken in
                    // 새로운 토큰으로 API 요청을 다시 시도합니다.
                    makeAPICall(with: newToken)
                }
            } else {
                // API 요청이 성공적으로 완료됨
                // 데이터를 처리하는 로직 작성
            }
        } else {
            // 응답에 문제가 있을 경우 처리
        }
    }.resume()
}

func refreshAccessToken(completion: @escaping (String) -> Void) {
    // Refresh Token을 사용하여 새로운 액세스 토큰을 요청하는 코드 작성
    // 백엔드 서버와 통신하여 새로운 토큰을 받아옵니다.
    let newAccessToken = "NEW_ACCESS_TOKEN"
    completion(newAccessToken)
}

이는 단순한 예시이며 실제 앱에서는 보안 및 안정성을 고려하여 보다 복잡하고 안전한 방법으로 구현해야 합니다. 실제로는 보안적인 측면을 고려하여 토큰 저장, 관리, 암호화 등의 추가적인 처리가 필요할 수 있습니다.