만약 "Last Login" 플러그인을 설치하고 갑자기 WordPress 사용자 화면이 깔끔하게 정리된 것처럼 보인다면, 그 깔끔함은 당신을 속이고 있는 것입니다. 날짜는 권위 있어 보이고, 정렬도 가능하며, 마치 확고한 사실처럼 보입니다. 하지만 그렇지 않습니다. WordPress는 원래 마지막 로그인 날짜를 저장하지 않으며, 해당 컬럼의 모든 값은 선택적 기억의 산물일 뿐입니다.
존재하지 않았던 역사
WordPress는 단순한 users 테이블에 계정을 관리합니다. 이름, 이메일, 비밀번호 해시, 가입 날짜 등을 저장합니다. 하지만 누군가가 마지막으로 인증한 시점을 기록하는 필드는 눈에 띄게 누락되어 있습니다. 이는 항상 그래왔습니다.
이 공백을 메우기 위해 플러그인을 설치하면, 플러그인은 로그인 프로세스에 후킹(hook)하여 사용자 메타데이터에 타임스탬프를 기록합니다. 이것이 메커니즘의 전부입니다. 서버 로그를 거슬러 올라가거나 이전 세션을 재구성하지 않습니다. 단지 플러그인을 활성화한 순간부터 관찰을 시작할 뿐입니다.
5년 동안 운영된 사이트를 상상해 보십시오. 그동안 수백 명의 편집자, 구독자, 계약직 직원이 로그인했습니다. 당신이 어느 화요일 오후에 추적 플러그인을 설치합니다. 수요일 아침, 선임 편집자가 로그인합니다. 플러그인은 시간과 날짜를 기록합니다. 하지만 당신의 관리자 계정은 아무것도 표시하지 않습니다. 설치 이후 로그인한 적이 없기 때문입니다. 2021년의 오래된 프리랜서 계정도 아무것도 표시되지 않습니다. 이 컬럼은 마치 두 사람 모두 사이트에 접속한 적이 없는 것처럼 보이게 만듭니다. 실제로는 기록이 과거를 가지고 있지 않을 뿐입니다. 데이터의 부재를 부재의 증거로 취급하는 것인데, 이는 액세스 권한을 관리할 때 매우 위험한 가정입니다.
이 컬럼이 당신을 오도하는 세 가지 방식
플러그인이 실행되면, 환상은 누락된 역사에서 왜곡된 현재 보고로 전환됩니다. 여기에는 세 가지 구체적인 함정이 있습니다.
활동이 아닌 인증을 추적합니다
사용자가 WordPress 로그인 화면에서 "Remember Me"(로그인 상태 유지)를 체크하면, 브라우저는 최대 14일 동안 유효할 수 있는 인증 쿠키를 받습니다. 이 기간 동안 사용자는 비밀번호를 다시 입력하지 않고도 대시보드를 열고, 포스트를 발행하고, 댓글을 관리하며, 설정을 업데이트할 수 있습니다. 그들의 세션은 살아있고 활성화된 상태입니다.
하지만 대부분의 Last Login 플러그인은 wp_login 액션을 감지합니다. 이 액션은 기존 세션이 갱신될 때가 아니라, 양식을 통해 자격 증명이 제출될 때만 발생합니다. 따라서 편집자가 월요일 아침에 로그인한 후 브라우저 세션을 유지하며 2주 내내 관리자 영역에서 작업하더라도, 컬럼에는 여전히 14일 전으로 표시될 수 있습니다. 해당 타임스탬프를 기반으로 보안 검토를 수행하면 해당 계정을 휴면 상태로 분류하게 됩니다. 하지만 계정은 전혀 휴면 상태가 아닙니다. 당신은 사람이 마지막으로 집에 들어온 시점이 아니라, 비밀번호가 입력된 시점을 보고 있는 것입니다.
감사 중 휴면 계정을 숨깁니다
대부분의 플러그인은 users 테이블을 usermeta 테이블과 조인(join)하여 정렬 가능한 컬럼을 구현합니다. 구조적으로는 타당합니다. 하지만 실질적으로는 가시성 버그를 유발합니다.
플러그인을 활성화한 이후 사용자가 한 번도 인증하지 않았다면, usermeta에 해당 키에 대한 행(row)이 아예 존재하지 않습니다. 가장 오래된 계정을 찾기 위해 "Last Login" 기준으로 사용자 목록을 정렬하면, 기본 쿼리는 메타데이터가 없는 사용자를 제외하는 경우가 많습니다. 이들은 정렬된 뷰에서 완전히 사라집니다.
당신은 정리 감사를 실시합니다. 내림차순으로 정렬하여 날짜가 점점 오래된 40명의 사용자를 확인합니다. 당신은 확신을 가지고 비활성화할 그룹을 식별합니다. 하지만 트래커를 단 한 번도 작동시키지 않아 8개월 동안 조용했던 10명의 계약직 계정은 전혀 보지 못했습니다. 이 계정들은 정렬된 목록에 나타나지 않으므로 당신의 결론에도 포함되지 않습니다. 당신의 감사가 문자 그대로 스스로의 조사 결과를 삭제해 버리는 셈입니다. 멤버십 사이트, 이러닝 플랫폼 또는 멀티사이트 네트워크에서는 이것이 특히 문제가 됩니다. 휴면 계정은 공격자가 가장 먼저 노리는 대상인 경우가 많기 때문입니다.
데이터는 쓸모없을 때만 존재합니다
여기에는 조용한 아이러니가 있습니다. WordPress 코어는 사용자 세션에 대해 어느 정도 알고 있습니다. 누군가 로그인하면 시스템은 세션 토큰을 생성하고 이를 사용자 메타데이터에 저장합니다. 관리자는 활성 세션을 확인하고 종료할 수 있습니다. 하지만 이 정보는 엄격하게 실시간(live) 정보입니다. 사용자가 로그아웃을 클릭하거나 세션이 자동으로 만료되는 순간, WordPress는 토큰을 삭제합니다. 기록이 증발하는 것입니다.
당신은 지금 누가 온라인인지 볼 수 있습니다. 하지만 어제 오전 10시에 누가 온라인이었는지는 쉽게 알 수 없습니다. 이 아키텍처는 과거 기록용이 아니라 실시간 세션 관리를 위해 구축되었기 때문입니다.
