iOS에서 자동완성(자동 암호 완성) 기능을 구현하는 방법 정리

cheshire0105·2025년 1월 7일

iOS

목록 보기
28/45
post-thumbnail

Swift iOS 앱에서 자동완성(자동 로그인) 기능 구현하기

Swift로 앱을 개발하면서 사용자가 로그인할 때, Safari나 웹에서 저장된 자격 정보를 바탕으로 자동완성(자동 로그인) 기능을 제공하고 싶을 때가 있다. 이를 위해서는 Associated DomainsShared Web Credentials를 활용해야 한다. 이번 글에서는 실제 구현 과정을 스텝별로 정리해본다.

아래 예시에서는 실제 고유 정보들을 일부 알파벳으로 대체했다.


1. Associated Domains 설정

자동완성 암호(자동 로그인)를 사용하려면, Xcode에서 Associated Domains 설정이 필요하다.

  1. Apple Developer 계정에서 앱 ID의 Associated Domains 기능을 활성화한다.
  2. Xcode 프로젝트의 Signing & Capabilities 탭에서 + Capability 버튼을 눌러 Associated Domains를 추가한다.
  3. 추가가 완료되면 Domainswebcredentials:도메인주소 형태로 입력한다.
    • 예시: webcredentials:abcd-efgh.web.app

이렇게 설정하면 앱과 해당 웹 도메인이 서로 연결되었음을 iOS 시스템이 인지하게 된다.


2. apple-app-site-association 파일 배포

Associated Domains를 사용하기 위해서는 도메인 주소의 루트 디렉터리에 apple-app-site-association 파일을 배포해야 한다. 이는 iOS에서 웹과 앱이 같은 소유임을 판별하는 기준이 된다.

아래는 예시 JSON 파일이다. (실제 도메인, Bundle ID는 알파벳으로 대체했다.)

{
  "webcredentials": {
    "apps": [
      "A1B2C3D4E5.com.UserName.AppName"
    ]
  },
  "applinks": {
    "apps": [],
    "details": [
      {
        "appIDs": ["A1B2C3D4E5.com.UserName.AppName"],
        "components": [
          {
            "#": "*",
            "exclude": false,
            "comment": "All"
          }
        ]
      }
    ]
  }
}
  • A1B2C3D4E5.com.UserName.AppName 부분은 실제로는 TeamID.BundleID 형태와 같다.
  • 여기서 webcredentials 영역에 앱을 명시함으로써, iOS가 해당 웹 도메인과 앱이 연결되어 있음을 알 수 있다.

3. Firebase Hosting에 apple-app-site-association 파일 설정

위의 파일을 Firebase Hosting에 배포하는 과정도 예시로 보여준다. (Firebase 프로젝트 설정은 이미 완료되었다고 가정한다.)

{
  "hosting": {
    "public": "AppName-Host-master",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**",
      "!/.well-known/apple-app-site-association",
      "!/apple-app-site-association"
    ],
    "headers": [
      {
        "source": "/.well-known/apple-app-site-association",
        "headers": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ]
      }
    ],
    "rewrites": [
      {
        "source": "/apple-app-site-association",
        "destination": "/.well-known/apple-app-site-association"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
  • ignore 설정에서 apple-app-site-association 파일이 무시되지 않도록 !/.well-known/apple-app-site-association!/apple-app-site-association를 추가한다.
  • headers 설정을 통해 apple-app-site-association 파일이 JSON 형식으로 인식되도록 Content-Typeapplication/json으로 지정한다.
  • rewrites 설정을 통해 apple-app-site-association 파일 접근 경로를 /.well-known/apple-app-site-association로 매핑한다.

이 과정을 통해 해당 도메인(abcd-efgh.web.app)에서 apple-app-site-association 파일을 정상적으로 다운로드할 수 있게 된다.


4. 로그인 화면에서 자동완성(자동 로그인) 설정하기

아래 코드는 로그인 화면에서 이메일과 비밀번호를 입력받는 예시 코드다. 여기서 UITextFieldtextContentTypeautocapitalizationType 설정이 핵심이다.

let emailTextField: UITextField = {
    let textField = UITextField()
    // ...
    textField.textContentType = .username   // 또는 .emailAddress
    textField.autocapitalizationType = .none
    // ...
    return textField
}()

let passwordTextField: UITextField = {
    let textField = UITextField()
    // ...
    textField.textContentType = .password
    textField.autocapitalizationType = .none
    // ...
    return textField
}()

4.1. textContentType 설정

  • textContentType = .username 또는 .emailAddress로 설정한다. (iOS 12+에서는 .username 권장)
  • passwordTextField.password로 설정한다.
  • 이렇게 해야 iOS가 “아, 이건 로그인 필드구나!” 하고 인식하게 된다.

4.2. autocapitalizationType 설정

  • autocapitalizationType = .none로 설정해 자동 대문자 변환을 막는다.
  • 이메일 주소, 비밀번호 등에는 대문자가 잘 쓰이지 않기 때문에 편의성을 위해 꼭 설정한다.

5. Shared Web Credentials 저장하기

로그인 성공 시, Shared Web Credentials API를 통해 iCloud 키체인에 사용자 정보를 저장할 수 있다. 이 API는 SecAddSharedWebCredential 함수를 사용한다.

func storeCredentialToSharedWebCredentials(domain: String, username: String, password: String) {
    SecAddSharedWebCredential(domain as CFString,
                              username as CFString,
                              password as CFString) { error in
        if let cfError = error {
            let nsError = cfError as Error as NSError
            if nsError.code == Int(errSecDuplicateItem) {
                print("이미 공유 웹 자격 증명에 존재하는 계정이다.")
            } else {
                print("공유 웹 자격 증명 저장 중 에러 발생: \(nsError.localizedDescription)")
            }
        } else {
            print("공유 웹 자격 증명에 성공적으로 저장되었다.")
        }
    }
}

위 함수에 도메인, 사용자 이메일, 비밀번호를 전달하면, iOS가 해당 정보를 iCloud 키체인과 연동해준다. 이때 도메인은 webcredentials:를 뺀 실제 도메인만 입력해야 한다. 예를 들어, webcredentials:abcd-efgh.web.app가 아니라 abcd-efgh.web.app를 사용한다.


6. 실제 로그인 로직에 적용하기

아래는 로그인 버튼을 눌렀을 때 실행되는 핵심 부분이다. Firebase Auth로 인증 성공 시에 storeCredentialToSharedWebCredentials를 호출하여 공유 웹 자격 증명에 저장한다.

@objc func loginTapped() {
    guard let email = emailTextField.text, let password = passwordTextField.text else {
        print("이메일 또는 비밀번호가 비어있다.")
        return
    }
    
    Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
        if let error = error {
            print("로그인 실패: \(error.localizedDescription)")
            // 로그인 실패 Alert 표시
            return
        }
        
        // 로그인 성공
        print("로그인 성공 - User ID: \(authResult?.user.uid ?? "nil")")
        
        // (1) 공유 웹 자격 증명에 저장
        self.storeCredentialToSharedWebCredentials(
            domain: "abcd-efgh.web.app",
            username: email,
            password: password
        )
        
        // (2) Firestore 등에서 사용자 정보 불러오기
        // (3) Realm 등 로컬 DB 저장
        // (4) 홈 화면으로 이동
    }
}
  • Auth.auth().signIn(withEmail: password:)를 통해 Firebase 인증을 진행한다.
  • 로그인 성공 시 storeCredentialToSharedWebCredentials 함수로 도메인, 이메일, 비밀번호를 넘긴다.
  • 이후에는 필요에 따라 사용자 정보를 Firestore에서 가져오거나, Realm에 저장한 뒤 화면 전환을 수행한다.

7. 마무리

지금까지 Swift iOS 앱에서 자동완성 기능(자동 로그인)을 구현하기 위해 필요한 전반적인 과정을 살펴보았다.
1. Apple Developer 계정에서 Associated Domains를 활성화하고, Xcode에서 Associated Domains를 설정한다.
2. Firebase Hosting(또는 본인이 사용 중인 서버)에 apple-app-site-association 파일을 배포한다.
3. iOS에서 로그인 TextFieldtextContentType, autocapitalizationType 등을 설정한다.
4. 로그인 성공 시 Shared Web Credentials API로 iCloud 키체인에 자격 증명을 저장한다.

이 과정을 제대로 거치면, 사용자가 iCloud 키체인을 통해 웹과 앱 양쪽에서 저장된 아이디/비밀번호를 자동완성으로 입력받을 수 있게 된다.
이를 통해 로그인 과정을 단순화하고, 사용자 경험을 한층 향상시킬 수 있다.

이상으로 Swift iOS 앱 자동완성(자동 로그인) 기능 구현 과정을 정리했다.
개발 시 참고하여 적용하면 더욱 편리한 앱을 제작할 수 있을 것이다.

주의

Firebase는 두 가지 종류의 자체 기본 도메인을 제공한다.

ABCD.web.app
ABCD.firebaseapp.com. 

하지만 경험상 첫 번째 도메인(web.app)으로는 도메인 주소가 검증되지 않는 경우가 있었다. 따라서 두 번째 도메인(firebaseapp.com)을 사용하는 것을 추천한다. 만약 반드시 web.app 도메인을 사용해야 한다면, 도메인을 별도로 구매한 뒤 설정하는 것이 필요하다.
도메인 검증 문제로 인해 시간을 낭비하지 않도록 미리 주의하는 것이 좋다.

0개의 댓글