Dados sensíveis (tokens, chaves API, credenciais) nunca devem ser armazenados em UserDefaults ou no filesystem. O Keychain Services é o único mecanismo aprovado pela Apple para armazenamento seguro em iOS.

Keychain Accessibility Options

O atributo kSecAttrAccessible define quando o item do Keychain pode ser acessado. A escolha impacta segurança e disponibilidade.

ConstanteDisponível quandoMigra em backup?Uso
kSecAttrAccessibleWhenUnlockedDispositivo desbloqueadoSimDados gerais do app
kSecAttrAccessibleAfterFirstUnlockApós primeiro desbloqueioSimBackground refresh, push notifications
kSecAttrAccessibleWhenUnlockedThisDeviceOnlyDesbloqueado, sem migraçãoNãoTokens de sessão
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnlyApós primeiro desbloqueio, sem migraçãoNãoRecomendado para SDKs
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnlyPasscode ativo + desbloqueadoNãoDados altamente sensíveis

App Transport Security (ATS)

RegraRequisitoExceção
HTTPS obrigatórioTodas as conexões devem usar HTTPSNSAllowsArbitraryLoads (requer justificativa na App Review)
TLS 1.2+Mínimo TLS 1.2 com forward secrecyNSExceptionMinimumTLSVersion por domínio
Certificado válidoCertificado assinado por CA confiávelCert pinning pode ser mais restritivo
SHA-256+Certificado com hash SHA-256 ou superiorNão há exceção — SHA-1 não é aceito
Qual a diferença entre Keychain e UserDefaults para armazenamento?
UserDefaults armazena em plist no filesystem — não é criptografado, qualquer processo com acesso ao sandbox pode ler. Keychain é criptografado pelo Secure Enclave, protegido por hardware, e sobrevive à desinstalação do app (a menos que use ThisDeviceOnly). Nunca armazene tokens, senhas ou chaves em UserDefaults.