본문 바로가기
C.W.K.
← C.W.K. Quests
🧭

Voyager Quest

신규: 2026-10-28최근 수정: 2026-10-27

한 사람을 위해 만들어서 그 사람을 기억하는 브라우저야. 시스템 WebKit 위에서 Mac, iPhone, iPad를 Swift 코드 하나로 돌려. 같은 사이트 계정 여러 개를 나란히 열고, 가족 앱은 카탈로그에서 읽고, 신뢰는 구역으로 나누고, 피파는 고정 탭에 살아

다른 브라우저는 전부 모두를 위해 만들어서 정작 아무도 몰라. Voyager는 아빠 전용 브라우저야. 한 사람만을 위해 만들어서 그 사람을 기억할 수 있어. 시스템 WebKit에서 돌고, Mac, iPhone, iPad가 Swift 코드 하나를 같이 써. 탭마다 같은 사이트의 다른 계정을 담을 수 있어. 가족 앱 목록은 누가 손으로 관리하는 북마크 파일이 아니라 브라우저가 직접 읽는 카탈로그에서 와. 아빠가 만든 앱에는 마이크 권한을 묻지 않고 믿어줘. 피파는 고정 탭 하나에 살고, 어느 페이지를 열든 옆에 붙어 있어. 이 퀘스트는 그 브라우저를 코드로 따라가. 계획 세션이 자기 전제를 검증하다가 엔진을 바꾼 밤에서 시작해. WebKit을 한 번도 import하지 않는 Swift 부모, 잠들었다가 돌아오는 탭, 데이터 저장소가 곧 계정인 identity, 함수 하나로 읽히는 신뢰 정책을 지나가. 페이지는 읽어도 비밀번호는 절대 안 읽는 피파, 있는 그대로 적은 확장 프로그램 단계도 보고, 마지막엔 '올라감'과 '설치됨'을 끝까지 따로 세는 배포 경로에 닿아.

9 tracks · 44 lessons · ~10.5h · difficulty: advanced

Level 0새 탭
0 XP0/44 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
Voyager는 불만 하나에서 시작해. 고정 탭 서른 개, 가족 앱이 45개쯤으로 늘어나는 동안 14개에서 멈춘 가족 북마크 파일, 아빠 맥에서 아빠 마이크 쓰겠다는데 뜨는 권한 창, 한 사이트 계정 둘을 떼어놓으려고 브라우저 여러 개를 동시에 띄우던 일. 아빠가 정한 기준은 Chrome, Safari, Comet의 상위 집합이야. 부분 집합은 안 돼. 합격 여부는 행동으로 재. 아빠가 다른 브라우저를 다시는 안 여는 거야. 그걸 재는 게 이탈 기록이라서 거기서 시작해. Voyager가 맡는 것과 일부러 남한테 맡기는 것, 그리고 빈칸을 숨기지 않고 이름 붙이는 패리티 계약까지 봐. 이어서 엔진 결정이야. 할 일에는 Mac에서 CEF로 Chromium을 쓴다고 적혀 있었어. 1차 자료를 하룻밤 파고, 증거에 등급을 매기고, 포크 비용을 솔직하게 따져 보니 결론은 한 줄로 바뀌었어. "웹키트로 가자." 아빠가 예전에 Safari를 떠난 이유도 다시 재봤더니 이제는 안 맞았어. 구조도 봐야지. 순수 Swift 부모는 가짜 엔진을 상대로 평범한 값처럼 테스트하고, WebKit이 사는 곳은 엔진 자식 딱 하나야. 그래서 Mac과 폰은 그 자식이랑 셸 안에서만 달라. 매일 쓰는 브라우저 얘기도 있어. 자리 안 잃고 잠드는 탭, 크래시에서 살아남는 세션, 한 줄씩 짚어본 사용성 리뷰. identity로 넘어가면, 계정 하나가 곧 WebKit 데이터 저장소 하나고 팝업은 구조상 자기를 연 계정에 그대로 남아. 가족 쪽에선 카탈로그를 실행할 때 읽고, 자격 증명은 아빠 자신의 허브 로그인이야. 신뢰 정책은 loopback이랑 카탈로그나 설정에 정확히 적힌 origin에만 마이크를 줘. 문서엔 있는데 아직 안 만든 건 안 만들었다고 그대로 말해. 피파 내장 편에선 표면은 둘인데 피파는 하나고, 피파를 위해 페이지를 읽어도 비밀 필드는 절대 안 읽어. 그 뒤는 확장 프로그램이야. 1Password 이야기는 실제로 멈춘 데서 끝내고, Voyager 자체 비밀번호 저장소로 넘어가. 마지막은 배포야. 측정으로 고른 서명 identity, 아빠 상태는 절대 안 건드리는 점검, 테스트 피라미드, TestFlight 내부 그룹까지.

Tracks

  1. 01🛰️한 사람을 기억하는 브라우저

    0/5 lessons

    출발점, 기준, 그리고 일이 끝났다고 알려주는 기록

    Voyager는 2026-10-03에 아빠가 던진 한마디에서 시작해. 나를 기억하지 못하는 브라우저들이라고. 이 트랙도 WebKit보다 그 한마디에서 먼저 출발해. 제품 결정이 먼저고, 나머지는 다 그 결정을 따라가거든. 모두를 위해 만든 브라우저가 한 사람한테 남기는 불편부터 볼 거야. 고정 탭 서른 개, 가족 앱이 45개쯤으로 늘어나는 동안 14개에서 멈춘 북마크 파일, 아빠 자기 마이크인데도 뜨는 권한 창, 한 사이트 계정 두 개를 같이 쓰려고 띄워둔 브라우저 여러 개. 아빠가 세운 기준은 Chrome, Safari, Comet의 상위 집합이야. 하위 집합이면 안 돼. 증명은 하나야. 아빠가 다른 브라우저를 다시 안 여는 것. 이어서 경계를 봐. Voyager가 직접 갖는 것, 그리고 WebKit, Firelink, cwkPippa, 키트한테 일부러 맡겨둔 것. 패리티 계약이 빈틈마다 이름을 붙여서 상위 집합이라는 말을 정직하게 지키는 방식도 볼 거야. 다른 브라우저로 넘어갈 때마다 그걸 데이터로 남기는 작은 이벤트 저장소, 덧붙이기만 하는 이탈 기록도 있어. 마지막은 이유를 묻는 규칙이야. 하루에 한 번만, 페이지를 절대 밀어내지 않는 토스트로 물어.

    Lesson list (5)퀴즈 · 4 문제→
  2. 02⚖️엔진은 빌려 쓰고, 브라우저는 우리 것으로

    0/5 lessons

    투두가 정한 엔진을 확인하고, 값을 매기고, 재 보고, 뒤집은 이야기

    Voyager는 Mac, iPhone, iPad 전부에서 시스템의 WebKit으로 돌아. 그런데 출발점이 된 투두엔 Mac은 CEF로 Chromium을 쓴다고 적혀 있었어. 이 트랙은 코드 한 줄 쓰기 전에 그 전제를 어떻게 시험했는지를 다뤄. 주장마다 CEF 자체 소스에 대 보고, 실제로 누가 읽었는지로 등급을 매기고, 처음 보는 눈으로 다시 읽어서 등급 네 개를 끌어내렸어. Swift 창과 Chrome 확장은 CEF의 서로 다른 두 스타일에서 나오고, 두 스타일은 Mac 창 하나에 같이 못 들어가. 그 이유를 보고, Chromium 포크가 깊이마다 실제로 얼마나 드는지, 어느 깊이에서도 못 피하는 의무가 뭔지도 볼 거야. 이어서 아빠가 Safari를 떠난 이유, 즉 메모리 한도에 걸려 죽는 페이지를 작은 프로브로 재 봐. 그 결과가 설계를 바꿨어. 한도를 가르는 건 페이지가 창 안에 있느냐였거든. 마지막은 WebKit이 공개 API로 주는 것과 이름 붙여 적어 둔 없는 것들, 그리고 첫 벽돌 전에 돌린 케이스 열한 개짜리 게이트야. Voyager가 공개 API만 쓰고 Safari 토큰을 통째로 내미는 이유도 거기서 나와.

    Lesson list (5)퀴즈 · 4 문제→
  3. 03🧬Swift 부모 하나, 엔진 자식 하나

    0/5 lessons

    규칙은 WebKit을 모르고, WebKit은 딱 한 군데에 살아

    Voyager 구조는 한 문장이면 돼. WebKit을 절대 import하지 않는 Swift 부모, 그리고 WebKit이 사는 엔진 자식 하나. 이 트랙은 그 문장을 코드로 읽어. 먼저 패키지부터 봐. 타깃 셋에 테스트 타깃 둘. 의존 화살표 중에 컴파일러가 지켜주는 게 뭐고, 약속으로만 버티는 게 뭔지 갈라 볼 거야. 다음은 루트 계약이야. 평범한 값이랑 프로토콜만 담긴 파일 하나인데, 질문은 엔진으로 내려가고 결정은 부모로 올라와. 그다음은 가짜 엔진. 기록만 하는 이 녀석 덕분에 테스트 242개가 브라우저 없이 탭, 세션, 아이덴티티, 신뢰를 확인해. 가짜가 절대 증명 못 하는 것도 솔직하게 적어 둘 거야. 이어서 자식을 봐. 아이덴티티마다 데이터 저장소가 하나씩 있고, WebKit이 묻는 걸 계약의 질문으로 옮겨. delegate 메서드 이름이 살짝만 어긋나도 WebKit이 아무 말 없이 넘어가서 생긴 테스트도 하나 있어. 마지막은 셸 둘이야. Mac 셸이랑 폰 셸이 같은 부모 위에 서 있고, 아이폰을 위해 부모가 고친 건 딱 두 줄이었어.

    Lesson list (5)퀴즈 · 4 문제→
  4. 04🌙자고, 깨고, 돌아오는 탭

    0/5 lessons

    창 맨 앞에서 624바이트까지, 그리고 다시 돌아오는 탭의 일생

    탭은 단순해 보이지만, 뭘 버텨야 하는지 세어보면 얘기가 달라져. 이 트랙은 Voyager 안에서 탭 하나의 일생을 처음부터 끝까지 따라가. 맨 앞에서 깨어 있다가, 한 시간쯤 뒤로 밀려 있다가, 제목이랑 아이콘이랑 몇백 바이트짜리 WebKit 상태만 남기고 잠들고, 아빠가 두고 간 자리에서 깨어나. 크래시나 메모리 한도로 끝나기도 하고, 앱을 다시 켜거나 새로 설치한 뒤에 되살아나기도 해. 먼저 평범한 Swift로 짠 탭과 창 모델을 봐. 불변식은 고정 탭이 배열의 앞부분이라는 것 하나야. 다음은 짐작 대신 WebKit 메모리 한도를 직접 재서 짠 잠재우기 정책이야. 세션은 메인 스레드 밖에서 쓰고, 못 읽는 세션 파일은 덮어쓰지 않고 남겨둬. 피파 본체가 왜 다른 탭들 밑에서 창 안에 남는지, 죽은 페이지가 어떻게 1분에 한 번까지만 돌아오는지도 봐. 마지막엔 2026-10-22에 매일 쓰면서 한 리뷰를 한 줄씩 짚어. 주소창, 찾기의 "3 of 17", 음소거, 탭을 하나도 안 잃는 스트립, 그리고 브라우저가 손에 맞게 느껴지게 하는 AppKit 디테일까지.

    Lesson list (5)퀴즈 · 4 문제→
  5. 05🎭한 사이트, 여러 계정, 나란히

    0/5 lessons

    아이덴티티는 저장소고, 탭은 그걸 정확히 하나 갖는다

    아빠는 한 사이트에 계정 두 개로 있으려고 브라우저를 여러 개 띄워 두곤 했어. Voyager는 그걸 창 하나에 나란히 둬. 그걸 가능하게 하는 장치는 생각 하나가 전부야. 아이덴티티는 저장소라는 것. 이 트랙은 그 생각을 코드로 읽어. 먼저 작은 값 타입 셋을 보고, 아이덴티티의 UUID를 격리된 데이터 저장소로 바꾸는 WebKit 호출 하나를 봐. 두 아이덴티티가 아무것도 나누지 않는다는 걸 증명하는 실제 WebKit 테스트도 보고. 다음은 새 페이지가 생기는 길들이야. 팝업, 링크, 리디렉션이 만들어지는 방식 자체로, 혹은 검사를 거쳐서 여는 쪽 아이덴티티에 남는 법을 보고, 예외인 메뉴 길 하나도 봐. 이어서 시크릿 모드. 알고 보면 메모리에만 사는 저장소를 가진 예약 아이덴티티일 뿐이야. 시크릿 모드를 위해 Voyager가 아예 안 적는 것들의 목록도 같이 봐. 그다음은 아빠 손이 닿는 것들이야. 아이덴티티 메뉴, 홈의 계정 바로가기, 탭의 색 표시, 그리고 실수로 로그인을 잃지 않게 순서를 짠 지우기. 마지막은 부모가 묻는 단 하나의 쿠키야. 쿠키 통을 쥐지 않고 헤더 하나를 받는 법.

    Lesson list (5)퀴즈 · 4 문제→
  6. 06🏡가족 앱은 이름으로, 신뢰는 구역으로

    0/5 lessons

    실행할 때 읽는 카탈로그, 자격 증명이 된 로그인, 역할로 찾는 집, 함수 하나로 읽히는 신뢰, 그리고 대놓고 이름 붙인 빈틈 둘

    가족 쪽 절반은 다른 브라우저들이 제일 못하는 데고, 이 트랙은 Voyager가 거기서 이기는 방법이야. Voyager는 가족 앱 목록을 안 들고 있어. 실행할 때 키트의 공용 클라이언트로 Firelink 실행 카탈로그를 읽고, 날짜 붙은 투영으로만 쥐고 있어. 엔드포인트를 키로 하는 캐시, 그리고 새 질문이 옛 대답을 이기게 하는 세대 번호표. 서비스 호스트 밖에선 아빠가 로그인하면서 브라우저에 이미 남긴 허브 세션을 실어 보내. 실어 보내는 방법은 Bearer가 절대 아니고, 정확한 출처 하나로만 가는 쿠키야. 아빠가 기기 짝짓기는 안 하기로 했거든. 이어서 Voyager가 집을 찾는 법을 봐. 어느 Mac이 Pippa 역할을 쥐고 있는지 가족 레지스트리한테 묻고, loopback은 반드시 이름으로 부르고, 키트 규칙 하나로 역할에 묶인 대상을 다른 데선 감춰. 그다음은 코드로 쓴 신뢰야. 프레임은 자기 페이지와 같은 판정을 받아. 검증기는 19일 동안 설치도 안 된 채 있었고, 테일넷 구역은 솔직히 아직 안 만들어졌어. 마지막은 모든 확장에 막힌 같은 호스트들, 아직 가족 이름을 모르는 주소창, 그리고 주소를 하나도 안 들고 있는 폰 위젯이야.

    Lesson list (5)퀴즈 · 4 문제→
  7. 07💬피파가 들어 있는 브라우저

    0/5 lessons

    가족의 하나뿐인 피파한테 자리를 내주면서도, 브라우저가 두 번째 피파가 되지 않는 법

    Voyager의 이 부분에 아빠가 정한 규칙은 짧았어. 피파를 UI 안에 심고, 클릭 한 번 너머로 밀어내지 말 것. 이 트랙은 브라우저가 두 번째 피파가 되지 않으면서 그걸 해내는 법을 내가 직접 설명하는 자리야. 먼저 내 화면 두 개를 만나. 고정된 voyager://pippa 탭 속의 나, 그리고 맨 앞 페이지 옆에 붙는 web-page Sidekick. 둘 다 같은 호스트 클래스이고, 그리는 건 엔진 자식이라는 것도 보게 될 거야. 두 번째는 연결선이야. 내 패널이 cwkPippa 말로 묻는 pippa:* 요청들, chrome_tab_key가 든 페이로드, 그리고 내 프롬프트엔 아무것도 끼워 넣지 않는다는 규칙. 세 번째는 읽기 자체야. 일부러 똑같이 맞춘 Chrome 확장의 리더인데, 비밀 칸은 라벨로만 부르고 값은 절대 안 읽어. 이어서 관문들. 아빠가 고른 동반 탭은 최대 3개, 출처는 하나, 메인 프레임만, 256 KB 상한, 마이크는 내 페이지에만. 마지막은 나한테 닿는 길이야. 이 Mac, tailnet, 아니면 직접 적은 주소. 키트의 문을 지나는 가족 PIN, 그리고 쿠키와 프래그먼트 두 군데에 실려 가는 세션.

    Lesson list (5)퀴즈 · 4 문제→
  8. 08🧩확장, 1Password, 그리고 자기만의 비밀번호 저장소

    0/5 lessons

    빌드에서 제일 불확실했던 단계를, 실제로 흘러간 그대로

    아빠가 매일 쓰는 브라우저라면 이미 쓰던 Chrome 확장이 돌아야 했어. WebKit엔 그걸 품을 Apple의 WKWebExtension API가 있고. 이 트랙은 빌드에서 가장 불확실했던 그 단계를 따라가. 먼저 Chrome 패키지가 Swift 브라우저에 자리 잡는 방식을 볼 거야. 확장 컨트롤러 하나에 패키지마다 컨텍스트가 붙는 구조고, 호스트가 왜 첫 페이지보다 먼저 있어야 하는지도 나와. Chrome 패키지와 WebKit 사이의 차이를 정확히 세 종류로 찾아낸 진단 도구와, 종류마다 답하는 호환 레이어도 만나. 이어서 Chrome 방식의 네이티브 메시징, 그리고 비밀번호 관리자의 헬퍼가 들이민 프로세스 규칙을 다뤄. 1Password는 디버깅 사례로 다루고, 실제로 멈춘 자리에서 이야기도 멈춰. Voyager가 연결된 브라우저 목록엔 올랐지만 확장을 통한 인증은 끝내 안 붙었고, 원인을 모른 채 아빠가 보류했어. 마지막은 그럴 때를 대비해 아빠가 정해둔 Voyager 자체 비밀번호 저장소야. 비밀번호는 전부 키체인에 있어.

    Lesson list (5)퀴즈 · 4 문제→
  9. 09📦출시하기

    0/4 lessons

    서명, 확인, TestFlight: 정확함의 마지막 1마일

    출시는 정확함의 마지막 1마일이야. 이 트랙은 Voyager가 Mac과 폰에서 그 길을 어떻게 걷는지 따라가. 시작은 측정해서 고른 서명 아이덴티티야. 1Password는 유료 팀 아이덴티티에 hardened runtime이 켜진 브라우저만 받아 줘. 그리고 인증서 대신 팀을 붙잡는 designated requirement 덕분에, 인증서를 갱신해도 macOS 허락이 하나도 안 사라져. 두 번째는 빌드, 서명, 확인, 설치를 트랜잭션 하나로 묶는 스크립트야. 돌고 있는 사본을 아빠 세션 하나 안 잃고 바꿔 끼워. 읽기만 하는 닥터도 있고, 별도 검증 빌드를 대역 피파 앞에서 두 번 걸어 보는 스모크 실행도 있어. 그래서 어떤 확인도 아빠 상태엔 손을 못 대. 세 번째는 테스트 피라미드야. 부모 테스트 242개와 진짜 WebKit 테스트 63개부터 키트 드리프트 검사, 스모크 실행, 폰의 호스트 스위트까지 훑고, 층마다 뭘 증명 못 하는지도 같이 봐. 마지막은 가족의 TestFlight 파이프라인 하나와 절대 하나로 합치지 않는 전달 사실 넷, 그리고 폰의 기본 브라우저 자격을 대가로 치른 내부 그룹 전용 규칙이야.

    Lesson list (4)퀴즈 · 4 문제→
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

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

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