iOS 앱을 개발하면서 토큰 기반 인증에 대해 깊이 공부하다가 한 가지 의문점이 생겼다. JWT(JSON Web Token)는 이미 자체적으로 암호화되어 있는데, 이를 왜 다시 iOS의 Keychain이라는 암호화된 저장소에 보관해야 하는지에 대한 의문이었다.
이 의문을 해결하기 위해 iOS의 보안 아키텍처를 자세히 살펴보았다. iOS는 앱 샌드박싱이라는 강력한 보안 모델을 기반으로 하고 있다. 각 앱은 자신만의 샌드박스 내에서 실행되며, 다른 앱의 데이터에 접근할 수 없다. 그러나 UserDefaults나 파일 시스템에 저장된 데이터는 기기가 탈옥되거나 물리적으로 접근당했을 때 노출될 위험이 있다.
이러한 상황에서 토큰이 제공하는 암호화는 네트워크 전송 과정에서의 보안을 담당한다. JWT는 서버와 클라이언트 간의 안전한 통신을 보장하지만, 앱 내부에 저장될 때의 보안은 보장하지 않는다. 여기서 iOS의 Keychain이 중요한 역할을 한다.
Keychain은 iOS에서 제공하는 암호화된 저장소로, 시스템 수준의 보안을 제공한다. 특히 iOS의 Secure Enclave라는 별도의 보안 프로세서와 연동되어 하드웨어 수준의 보안을 제공한다. 토큰을 Keychain에 저장함으로써, 앱이 백그라운드 상태이거나 종료된 상태에서도 토큰이 안전하게 보호된다.
실제 iOS 앱 개발에서는 로그인 후 받은 JWT 토큰을 Keychain에 저장하고, API 요청이 필요할 때마다 Keychain에서 토큰을 꺼내어 사용한다. 이때 토큰은 HTTP 헤더의 Authorization 필드에 포함되어 서버로 전송된다. 만약 토큰이 만료되었다면, 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받는데, 이 리프레시 토큰 역시 Keychain에 안전하게 보관된다.
이러한 이중 보안 체계는 iOS 앱에서 특히 중요하다. 모바일 기기는 분실이나 도난의 위험이 있고, 물리적인 해킹 시도에 노출될 수 있기 때문이다. 토큰의 암호화는 네트워크 상의 보안을, Keychain의 암호화는 디바이스 상의 보안을 담당함으로써, 서로 다른 위협 모델에 대응하는 것이다.
결과적으로 iOS 앱에서 토큰을 Keychain에 저장하는 것은 불필요한 이중 암호화가 아니라, 서로 다른 보안 위협에 대응하기 위한 필수적인 보안 계층임을 이해하게 되었다. 이는 iOS의 보안 철학과도 일맥상통하는데, iOS는 여러 계층의 보안 메커니즘을 통해 사용자의 데이터를 보호하는 것을 중요시하기 때문이다.
토큰과 Keychain에 대해 공부하면서 또 다른 흥미로운 의문이 들었다. 암호화된 토큰을 암호화된 공간인 keychain에 저장할 만큼 보안에 신경쓰는 Apple인데, Apple 기기들은 Handoff, AirDrop, Universal Clipboard 등을 통해 서로 긴밀하게 연결되어 있고, MacBook에서는 iPhone의 핫스팟을 자동으로 연결하거나 외부 디스플레이를 쉽게 확장할 수 있다. "이런 편리한 연결성이 오히려 보안에 취약점이 되지 않을까?"라는 생각이 들었다.
이러한 우려는 매우 타당하지만, Apple은 이에 대해 매우 엄격한 보안 정책을 가지고 있다. Apple의 보안 철학은 "Zero Trust(제로 트러스트)" 모델에 기반을 두고 있다. 이는 기본적으로 모든 연결과 통신을 신뢰하지 않고, 각각의 요청을 독립적으로 검증하는 방식이다.
예를 들어, iCloud Keychain 동기화의 경우:
1. 각 기기는 고유한 암호화 키를 가지고 있다
2. 기기 간 통신은 end-to-end 암호화를 사용한다
3. 동기화 전에 기기 인증과 사용자 인증을 모두 요구한다
4. Apple ID의 2단계 인증이 필수적이다
AirDrop이나 Handoff와 같은 기능도:
1. Bluetooth LE를 통한 초기 발견 단계
2. 직접적인 Wi-Fi P2P 연결 생성
3. iCloud 인증을 통한 기기 확인
4. 각 전송마다 새로운 암호화 키 생성
이러한 다중 보안 계층은 편리한 기능을 제공하면서도 보안을 최우선으로 한다는 Apple의 철학을 잘 보여준다. 이는 앞서 설명한 토큰과 Keychain의 이중 보안과도 같은 맥락이다.
따라서 Apple 생태계의 연결성이 반드시 보안의 약점으로 이어지지는 않는다. 오히려 각 연결과 통신마다 엄격한 검증과 암호화를 적용함으로써, 편리성과 보안성을 모두 달성하고 있다. 이는 "Trust No One(누구도 신뢰하지 않는다)"이라는 현대 보안의 기본 원칙을 충실히 따르는 것이다.
이러한 맥락에서 볼 때, iOS 앱에서 토큰을 Keychain에 저장하는 것은 이러한 다중 보안 철학의 일부이며, 각각의 보안 계층이 서로 다른 위협으로부터 보호하는 역할을 한다는 것을 더욱 명확히 이해할 수 있다.