본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

불투명한 자리는 다시 꺼내보게 해서 확인해

~11 min · recopy-compare, opaque-target, window-match, reproduction

Level 0식은 부싯돌
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"들여다볼 수 없으면 다시 해보게 시켜. 또 복사시켰는데 같은 글이 나오면, 같은 게 아직 긁혀 있는 거야."

다시 읽을 요소가 없어

네이티브 확인은 포커스된 요소랑 범위를 다시 읽는 데 기댔지. 불투명한 자리는 — Track 3 에서 본 Chromium 이랑 Electron 앱들 — 다시 읽을 그 요소를 안 내줘. 그러니 '범위를 맞춰보자' 는 방법 자체가 없어져. 못 보는 걸 들여다볼 수는 없으니까. 그래도 다른 방법으로 확인할 수는 있어. 이 앱들이 확실하게 해주는 한 가지를 쓰면 돼. 복사.

다시 해보게 해서 확인하기

생각은 이래. 긁힌 게 그대로인지, 다시 꺼내보게 시켜서 확인하는 거야. Cmd+C 를 한 번 더 보냈는데 칠 때 붙잡아뒀던 그 글이 그대로 클립보드에 올라오면, 같은 게 같은 자리에 아직 긁혀 있다는 뜻이지. 앱이 방금 직접 보여준 셈이고. 다른 글이 나오거나 아무것도 안 나오면 기다리는 사이에 긁힌 게 바뀐 거니까 대신하면 안 되고. 들여다보기 대신 다시 해보게 하는 거야. 자리를 볼 수는 없어도, 긁힌 걸 한 번 더 보여달라고 해서 그대로인지 확인할 수는 있으니까.

네이티브:  요소 다시 읽기 -> 범위 맞추기        (들여다보기)
불투명:    같은 창인가? + 다시 복사 -> 글 맞추기  (다시 해보게 하기)

둘 다 같은 질문에 답한다. '내가 붙잡은 그 글이 아직
긁혀 있나?' 자리가 허락하는 방법으로 물을 뿐이다.

같은 창에, 같은 글

불투명한 자리 확인은 두 부분이야. 먼저 같은 창이 아직 앞에 있는지 봐. 이 앱들이 그래도 내주는, 좀 더 성긴 정체 확인이지. 그다음 다시 해보게 하는 거야. 되돌려놓는 Cmd+C 를 한 번 더 — Track 3 의 그 방식 그대로, 클립보드 통째로 떠뒀다 되돌려놓기까지 — 해서 나온 글이 붙잡아뒀던 것과 같아야 해. 창도 맞고 그리고 다시 꺼낸 글도 똑같을 때만 Flint 가 확인됐다고 봐. 둘 중 하나라도 어긋나면 결과를 클립보드로 내려주고.

들여다볼 수 없으면 다시 해보게 하는 것도 확인이야. 확인이 늘 값을 직접 읽는 걸 뜻하진 않아. 어떤 조건이 아직 성립하는지 아는 정직한 방법이, 그걸 만들어낸 걸 한 번 더 시켜서 같은 결과가 나오는지 보는 것일 때가 있거든. 들여다보기보다 알려주는 게 적긴 해도, 들여다볼 수 없는 자리에선 똑같이 나오는 재현이 진짜 확인이야. 그냥 그대로겠거니 하는 것보다 훨씬 낫고.
다시 복사하는 것도 빌리는 거야. 똑같이 되돌려놔야 해. 불투명한 자리를 확인하는 것도 처음 읽을 때랑 똑같이 클립보드를 빌리는 거라 같은 빚을 져. 먼저 통째로 떠두고, 맞춰보려고 복사하고, 끝나면 전부 되돌려놓기. 맞았든 틀렸든. 확인하겠다고 사용자 클립보드를 삼켜버리면 안전 하나를 다른 안전이랑 바꿔치기하는 꼴이야. Track 3 의 되돌려놓기 규율은 한 번 쓰고 버리는 요령이 아니라, Flint 가 뭘 알아내려고 클립보드를 만질 때마다 다시 쓰는 거야.

Code

불투명한 자리 확인: 같은 창 + 긁힌 글 다시 꺼내보기·swift
func proveOpaque(_ snap: TargetSnapshot) -> Bool {
    // 1. 같은 창이 아직 앞에 있나 (불투명한 앱이 그래도 내주는 정체).
    guard let front = NSWorkspace.shared.frontmostApplication,
          front.processIdentifier == snap.pid,
          sameFocusedWindow(as: snap) else { return false }

    // 2. 되돌려놓는 복사로 긁힌 글을 다시 꺼내본다 (Track 3).
    //    통째로 떠두기 -> Cmd+C -> 읽기 -> 되돌려놓기, 언제나.
    let reproduced = probeSelectionViaCopy()   // 클립보드는 그대로 보존된다

    // 같은 글이 나왔다 == 같은 게 아직 긁혀 있다 == 대신해도 안전하다.
    return reproduced == snap.selection
}

External links

Exercise

Electron 채팅 앱을 놓고 불투명한 자리 확인 절차를 설계해봐. 그리고 각 단계가 뭘 걸러내는지도 짚어봐. 같은 창인지 보는 것, 되돌려놓는 재복사, 붙잡아둔 글이랑 맞춰보기. 그다음 이 방식이 네이티브 범위 확인보다 약한데도 왜 여기선 받아들일 만한지, 그리고 재복사가 Track 3 에서 물려받는 빚이 뭔지 말해봐.
Hint
창 확인이 '창이나 앱을 갈아탔다' 를 걸러내고, 재복사가 '긁힌 게 바뀌거나 풀렸다' 를 걸러내고, 맞춰보기가 '이제 다른 글이 긁혀 있다' 를 걸러내. 이 방식이 받아들일 만한 건 불투명한 자리엔 들여다보기가 아예 불가능한데, 똑같은 글이 다시 나온다는 게 같은 게 긁혀 있다는 진짜 증거이기 때문이야. 물려받는 빚은 되돌려놓기 규율이고. 맞춰보려고 복사할 때도 클립보드를 통째로 떠뒀다가 어느 길로 끝나든 되돌려놔야 해.

Progress

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

댓글 0

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

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