[swift] Alamofire와 함께 사용하는 OAuth 인증 구현하기

Alamofire Logo

OAuth는 웹 상에서 안전하게 인증 및 권한 부여를 위한 개방형 표준 프로토콜입니다. 앱 개발에서도 OAuth를 활용하여 외부 서비스의 API를 사용할 수 있습니다. 이번 포스트에서는 Swift 프로젝트에서 Alamofire와 함께 OAuth 인증을 구현하는 방법을 알아보겠습니다.

시작하기 전에

OAuth 인증을 구현하기 전, 이해해야 할 몇 가지 개념이 있습니다.

  1. Consumer Key와 Consumer Secret: 서비스 제공자로부터 받은 고유한 키와 시크릿으로, 인증 요청시 신원을 확인하기 위해 사용됩니다.
  2. Request Token: Consumer Key와 Consumer Secret을 사용하여 Access Token을 얻기 위한 인증 요청을 보낼 때 사용되는 토큰입니다.
  3. Access Token: 인증이 완료된 사용자를 위해 발급된 토큰으로, API 요청에 사용됩니다.
  4. OAuth 인증 플로우: Request Token을 얻고, 사용자를 인증 페이지로 리다이렉션하여 인증을 받은 뒤, Access Token을 얻는 과정입니다.

Alamofire와 OAuth 인증 구현하기

  1. Alamofire 설치: Cocoapods를 통해 Alamofire를 설치합니다.
pod 'Alamofire'
  1. OAuth 관련 클래스 구현:

ConsumerKey, ConsumerSecret과 같은 필수 정보를 저장하기 위해 OAuthConfiguration 클래스를 구현합니다.

struct OAuthConfiguration {
    let consumerKey: String
    let consumerSecret: String
    // 다른 필요한 정보들
}

OAuth 관련 함수를 제공하는 OAuthManager 클래스를 구현합니다.

class OAuthManager {
    let configuration: OAuthConfiguration
    
    init(configuration: OAuthConfiguration) {
        self.configuration = configuration
    }
    
    func getRequestToken(completionHandler: @escaping (Result<String, Error>) -> Void) {
        // Request Token을 얻는 로직 구현
    }
    
    func getAccessToken(verifier: String, completionHandler: @escaping (Result<String, Error>) -> Void) {
        // Access Token을 얻는 로직 구현
    }
    
    // 사용자 인증 요청 등 다른 OAuth 관련 함수들
}
  1. OAuth 인증 플로우 구현하기:

OAuth 인증 과정에 따라 필요한 메소드를 OAuthManager에 추가하고 구현합니다.

class OAuthManager {
    // 이전 코드 생략
    
    func authenticateUser(completionHandler: @escaping (Result<Void, Error>) -> Void) {
        getRequestToken { result in
            switch result {
            case .success(let requestToken):
                print("Request Token: \(requestToken)")
                // 사용자를 인증 페이지로 리다이렉션하는 로직 구현
                
            case .failure(let error):
                completionHandler(.failure(error))
            }
        }
    }
    
    func handleRedirectURL(url: URL) {
        // 리다이렉트 된 URL을 처리하는 로직 구현
    }
    
    // 이전 코드 생략
}
  1. Alamofire를 통해 API 호출하기:

Alamofire를 사용하여 API 호출 시, OAuth 인증이 필요한 경우 AccessToken을 요청 헤더에 추가해야 합니다.

class APIManager {
    let oauthManager: OAuthManager
    
    init(oauthManager: OAuthManager) {
        self.oauthManager = oauthManager
    }
    
    func makeAPIRequest(endpoint: String, parameters: [String: Any], completionHandler: @escaping (Result<Any, Error>) -> Void) {
        oauthManager.getAccessToken { result in
            switch result {
            case .success(let accessToken):
                let headers: HTTPHeaders = [
                    "Authorization": "Bearer \(accessToken)"
                ]
                AF.request(endpoint, parameters: parameters, headers: headers).responseJSON { response in
                    switch response.result {
                    case .success(let value):
                        completionHandler(.success(value))
                        
                    case .failure(let error):
                        completionHandler(.failure(error))
                    }
                }
                
            case .failure(let error):
                completionHandler(.failure(error))
            }
        }
    }
}

결론

위와 같이 Alamofire와 OAuth를 함께 사용하여 안전하게 API 인증을 구현할 수 있습니다. OAuth 인증을 구현하는 경우에는 요구되는 인증 플로우와 토큰 요청, 헤더에 토큰 추가 등을 정확히 구현해야 합니다. Alamofire는 이러한 과정을 간소화하며, 가독성과 확장성을 높여줍니다.

참고문헌: