프로젝트를 만들었는데 어느 계정을 쓸지 아직 고르지 않았을 수 있다. 그때 최근 로그인 계정에 조용히 연결하면 편해 보여도 사용자의 선택을 대신한 것이다. 나는 미지정을 실제 빈 로그인 상태로 만들고 명시한 계정을 고른 뒤 연결하게 했다.
빈 상태를 화면 문구로만 만들지 않는다
emptyAccount는 새 ID의 일반 프로필을 만들고 unassigned를 표시한다. 이름만 “미지정”으로 바꾸면서 기존 기본 세션을 그대로 쓰는 방식이 아니다. newProjectTab은 프로젝트의 해당 플랫폼 선택이 없으면 이 빈 프로필을 사용한다.
시크릿 모드는 별도 조건으로 유지한다. 미지정은 반드시 시크릿이라는 뜻이 아니라 아직 저장 계정과 연결하지 않은 일반 세션이다. 이 차이를 명확히 해야 사용자가 로그인한 뒤 이어 쓰는 동작과 종료 시 보존 정책을 혼동하지 않는다. 빈 상태에도 구체적인 수명과 소유가 필요했다.
기본 사용과 특정 계정, 미지정을 나눈다
계정 선택에는 프로젝트 기본 사용과 특정 저장 프로필, account:none 같은 미지정 경로가 있다. 기본을 요청했는데 맞는 선택이 없으면 임의의 최근 로그인으로 메우지 않고 빈 상태를 만든다. 특정 계정 전환도 현재 탭과 프로젝트가 맞는지 확인한다.
계정을 바꿀 때 원래 탭의 원고를 새 계정에 복사하는 기능으로 처리하지 않는다. 기존 세션의 알맞은 탭을 찾거나 새 계정 쪽 표면을 만들고 소속 관계를 남긴다. 선택 값 하나가 바뀌었다고 모든 기존 문서를 같은 계정의 자료처럼 다시 해석해서는 안 된다.
로그인 흔적 발견을 인증 성공으로 세지 않는다
미지정 프로필에서 알려진 플랫폼의 인증 쿠키 이름·도메인 변화가 보이면 저장 계정 목록으로 발견할 수 있다. 이 경로는 쿠키 값을 계정명으로 가져오는 방식이 아니다. 발견 뒤 표시 상태와 실제 사이트의 계정 확인은 별도로 둔다.
쿠키가 있다는 것만으로 유효 로그인과 특정 ID를 보장할 수 없다. 만료와 로그아웃, 서비스의 추가 인증도 있다. 나는 자동 발견이 편하다는 이유로 실제 인증 확인까지 끝났다고 쓰지 않는다. 관찰 가능한 헤더와 사용자 선택, 저장 표시명은 각각 어떤 근거인지 구분해야 한다.
실제 프로젝트 시험은 빈 세션의 분리도 본다
기존 격리 시험은 새 프로젝트가 unassigned로 시작하는지 확인한다. 이후 같은 저장 계정을 선택한 두 프로젝트는 시험용 세션을 공유하고, 미지정 새 탭에는 그 시험 쿠키가 들어오지 않는지 본다. 공유할 경우와 공유하지 않을 경우를 같은 자료로 대조한 것이다.
시험은 소유한 프로필과 HTTPS fixture를 사용한다. 사용자의 실제 인증 값을 읽어 다른 프로필로 복제한 시험이 아니다. 이 글에서는 코드와 기존 시험 시나리오를 읽었으며 새 실제 로그인이나 계정 전환을 수행하지 않았다. 플랫폼의 모든 인증 상태를 자동 판정한다는 검증으로 확대하지 않는다.
미지정을 오류라고 강제로 채우지 않는다
프로젝트를 둘러보거나 공개 자료만 읽을 때는 계정을 아직 고르지 않아도 된다. 빈 로그인 상태가 있다는 이유로 모든 작업을 시작하지 못하게 하거나 불필요한 로그인 선택을 강요하지 않는다. 다만 실제 인증이 필요한 행동은 그 단계의 조건을 확인해야 한다.
나는 계정 선택이 없는 상태와 실행할 수 없는 상태를 같은 것으로 만들지 않으려 했다. 어떤 작업은 가능하고 어떤 작업은 인증이 더 필요하다. 이 차이를 화면 문구와 실행 경계에 남겨야 편한 시작과 명확한 소유권을 함께 유지할 수 있다.
회사 프로그램의 빈 선택도 의미가 있다
거래처·담당자·창고를 아직 고르지 않은 화면도 비슷하다. 빈 값을 최근 항목으로 자동 채우면 사용자가 보지 못한 선택이 처리 결과에 들어간다. 나는 미지정을 실제 상태로 표현하는 것이 불편한 빈칸보다 중요한 업무 계약이라고 본다.
북극성에서는 그 계약을 빈 프로필과 명시한 계정 연결로 구현했다. 같은 계정을 함께 쓸 때의 세션 공유는 유지하되 미선택이 그 공유로 빨려 들어가지 않게 한다. 선택하지 않은 값도 정확히 남겨야 이후 자료와 실행 결과가 어느 계정의 것인지 설명할 수 있다.