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

Killswitch — 제일 값진 버튼 하나

~15 min · killswitch, ui, bookmarks

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

이 퀘스트의 모든 layer 가 한 순간을 위해 봉사해 — 디바이스 사라졌다고 깨닫는 날. Killswitch 는 그 순간을 위한 장치야. 갖춰야 할 건 넷. 빨라야 하고 (한 클릭), 빠짐없어야 하고 (모든 쿠키를 죽여야), 되돌릴 수 있어야 하고 (다시 로그인이 돼야), 다른 디바이스에서 닿아야 해.

구체적 의미의 "killswitch"

액션영향SQL
모든 Session Revoke어디든 모든 브라우저 session 이 다음 요청에 logoutDELETE FROM security_sessions
PIN 전역 비활성 (하지 마)auth 통째 우회하는 플래그 set절대 하지 마. 원하는 것의 정반대야
특정 IP blacklist 추가그 source IP 가 로그인 시도조차 못 함INSERT INTO security_blacklist
Retry limit 일시적 강화사고 중엔 max_retry 를 5 에서 2 로UPDATE security_config SET max_retry = 2

UI — 크고 빨갛게

버튼은 정신없는 와중에도 찾을 수 있어야 해. confirm dialog 하나 뒤에만 숨겨 ("살아있는 session 3개를 다 revoke 할까?"). 잘못 눌러서 하루를 날리지 않으려는 거고, 딱 거기까지야. 클릭이 하나 늘 때마다 네 것이 1초씩 더 노출되니까.

Code

엔드포인트 (audit logging 포함)·python
@app.post("/admin/security/revoke-all")
async def revoke_all(request: Request):
    require_admin(request)
    cur = db.execute("DELETE FROM security_sessions")
    db.commit()
    audit_log("revoke_all", actor_ip=client_ip(request), count=cur.rowcount)
    return {"revoked": cur.rowcount}
버튼 — 크고, 빨갛고, confirm 한 번·html
<button
  class="btn-danger"
  onclick="if(confirm('모든 active session revoke? 모든 디바이스가 PIN 다시 입력해야.')) revokeAll()"
>
  🚨 Revoke All Sessions
</button>

External links

Exercise

/admin/security/revoke-all 와 큰 빨간 버튼을 simple admin 페이지에 추가. 노트북, (있으면) 다른 노트북, 폰, 태블릿에 페이지 북마크. 시간을 재봐. '노트북 열기' 부터 'confirm 누르기' 까지, 제일 느린 디바이스가 몇 초야? 30초를 넘으면 그건 UX 버그야.

Progress

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

댓글 0

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

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