"할 수 있는 걸 줄이는 거랑, 이게 누군지 덜 확인하는 건 전혀 다른 얘기야."
런처는 힘이 작지, 덜 믿기는 게 아냐
family PIN 이 통과되면 Native Launcher 는 기기 단위 읽기 전용 자격을 받아. catalog 를 읽을 수 있고, 쓸 수 있는 건 딱 하나야. 자기 기기의 최근 목록이랑 즐겨찾기. 바꾸는 API 는 하나도 못 부르고, 그 쓰기가 repository 나 서비스, 다른 사람 설정에 닿지도 않아. 이게 깔끔하게 권한만 줄인 모양이야. 런처는 PIN 을 거쳤으니 인증은 완전히 된 상태고, 다만 아주 작고 무해한 자리로 범위가 좁혀졌을 뿐이지. 신원은 확실하고, 힘은 작고.
읽기 전용 잠금은 인증이랑 다른 축이야
같은 생각이 여행에도 안전한 둘러보기 모드를 줘. 읽기 전용 잠금을 켜면 그 세션에선 바꾸는 게 전부 꺼져. 호텔에서 그냥 상태만 보고 싶을 때나, 누구한테 구경만 시켜줄 때 좋지. 그러면서 인증은 조금도 안 약해져. 잠금은 세션이 뭘 할 수 있는지를 낮추지, 그 세션이 누구인지를 얼마나 확신하는지는 안 건드려. 이건 서로 다른 두 손잡이인데 뭉쳐놓는 실수가 흔해. '읽기 전용' 이 '덜 인증됨' 으로 구현되면 안 돼. 완전히 확인된 상태로 동시에 일부러 무력할 수 있어야 하고.
비밀이랑 파일은 제자리에
마무리로 위생 규칙 둘. 첫째, 비밀은 API 응답에도, 감사 기록에도, 로그에도, 런처 캐시에도 안 들어가. 자격이든 비밀이 섞인 명령 출력이든 세션 토큰이든. 아예 안 돌아다니는 비밀은 오가는 중에도, 기기에 남은 채로도 샐 수가 없거든. 둘째, 정적 파일은 정해둔 빌드 폴더에서만 내보내고, 없는 경로 요청엔 앱 껍데기를 돌려줘. 아무 파일이나 찾아 주는 게 아니라. 그래야 조작된 경로가 빌드 폴더를 걸어 나가서 보면 안 될 걸 못 읽어. 둘 다 같은 감각이야. 위험한 건 제 자리에 가둬둔다는 것.