본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

비밀번호는 macOS 것

~11 min · keychain, no-credential-store, no-leak

Level 0Finder 에서 헤매는 중
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"제일 안전한 비밀번호는 네 앱이 아예 안 가진 비밀번호야. 안 가진 건 흘릴 수도 없거든."

저장하고 싶어지는 마음

공유에 다시 연결하는 건 앱이 사용자 이름과 비밀번호를 기억하면 매끄러워져. 그래서 어딘가 넣어두고 싶어지지. 저장한 주소 안에(smb://user:pass@host), 앱 DB 에, 설정 파일에. 전부 언젠가 새는 자리야. 주소는 로그에 찍히고, DB 는 읽을 수 있는 곳에 백업되고, 설정 파일은 git 에 올라가. 저장한 비밀은 나갈 문이 많은 비밀이야.

Waygate 는 아예 안 가져

Waygate 는 비밀을 아예 안 가져서 이 위험을 통째로 없앴어. 비밀번호를 담는 자리가 없어. 사용자 이름과 비밀번호는 macOS 연결 창과 Keychain 이 통째로 맡아. 시스템이 묻고, 시스템이 보관하고, 연결할 때 시스템이 내줘. Waygate 는 그걸 주소에도 SQLite 에도 로그 한 줄에도 git 에 닿을 만한 어디에도 안 넣어. 공유를 붙여야 하면 시스템 흐름을 띄우고 물러나.

안 갖는 게 제일 센 보호야

새겨둘 만한 보안 원리야. 비밀을 안 흘리는 제일 확실한 방법은 애초에 안 갖는 거야. 저장한 비밀번호를 암호화하는 건 평문보다야 낫지만, 여전히 열쇠와 암호문과 책임을 네 앱이 진다는 뜻이지. Keychain 에 맡기면 그 비밀이 처음부터 네 것이 아니었던 게 되고. Waygate 는 매번 맡기는 쪽을 골라. 파일 관리자가 할 일은 파일을 보고 바꾸는 거지 비밀번호 관리자 노릇이 아니니까.

비밀번호는 macOS 와 Keychain 에만 있고 Waygate 는 하나도 안 남겨. 사용자 이름이나 비밀번호가 주소에도, DB 에도, 로그에도, git 에도 들어가지 않아. 연결은 시스템 흐름에 맡기고 비밀은 macOS 가 갖게 둬. 안 갖고 있는 게 안 흘리는 제일 확실한 길이거든.
가족 전체가 같은 자세야. cwk 형제 앱들 규칙이 똑같아. 비밀은 OS Keychain 에 있고, repo 에도 로그에도 안 남아. 이 퀘스트에서도 내부 참조는 개념으로만 말하지 진짜 호스트 이름이나 IP 나 비밀번호로 말하지 않아. 아빠가 만드는 것들은 믿음을 주고받는 자리고, 비밀번호를 쟁여두는 파일 관리자는 자기가 벌어야 할 그 믿음을 스스로 깨는 셈이니까.

Code

누가 비밀번호를 갖느냐·swift
// WRONG -- the credential is now in a URL string that leaks into logs,
// history, crash reports, and anywhere the URL is serialized:
let url = URL(string: "smb://alice:hunter2@fileserver.local/projects")!   // LEAK
saveToDatabase(url)                                                       // LEAK^2

// RIGHT -- store only the sanitized address; ask macOS to connect.
// macOS prompts for and stores the credential in Keychain; Waygate never sees it:
let endpoint = SavedNetworkLocation(scheme: "smb", host: "fileserver.local",
                                    share: "projects", displayName: "Projects")
NSWorkspace.shared.open(endpoint.connectURL)   // system connect flow owns the secret
// Waygate's database stores `endpoint`. There is no password anywhere in it.

External links

Exercise

비밀번호로 어딘가에 연결하는, 네가 짠 앱이나 스크립트를 점검해봐. 비밀이 어디 있어? 설정 파일, 환경 변수, 주소, 코드에 박힌 문자열? 그 값이 흘러갈 수 있는 데를 다 짚어봐. 로그, 백업, git, 오류 보고. 그다음 앱이 비밀을 아예 안 갖도록 다시 설계해. 대신 누가 가져?
Hint
비밀의 사본을 따라가봐. 설정 파일은 백업되고, 환경 변수는 프로세스 목록과 크래시 덤프에 보이고, 주소는 로그에 떨어져. 다시 설계하면 필요할 때 물어보고 내주는 시스템 보관소(Keychain 같은)에 맡기게 되고, 네 코드는 값이 아니라 참조만 갖게 돼. 제일 좋은 점검 결과는 '흘릴 비밀이 애초에 내 프로세스에 없었다' 야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.