
티스토리 자동화에서 로그인은 자동화하지 않는 것이 정석이다. 카카오 계정 로그인은 캡차와 2단계 인증이 걸리고, 비밀번호를 스크립트에 넣는 순간 보안 사고의 씨앗이 된다. 그래서 사람이 한 번 로그인한 브라우저 프로필을 저장해 두고 재사용하는 방식을 택했는데, 다음 실행에서 어김없이 로그인 화면으로 튕겼다. 이 글은 그 원인이 티스토리 쿠키의 수명 설정에 있었다는 것, 그리고 비밀번호 없이 세션을 복구하는 방법을 다룬다.
브라우저 프로필을 저장했는데 왜 로그아웃되는가
Playwright의 launch_persistent_context는 크로미움 사용자 데이터 디렉터리를 지정해 브라우저를 띄운다. 쿠키, 로컬 스토리지, 로그인 상태가 그 디렉터리에 남는다. 처음에는 이걸로 충분하다고 봤다. 헤디드 브라우저를 띄워 사람이 카카오로 로그인하고, 관리 페이지에 들어가지는 것을 확인한 뒤 브라우저를 닫았다.
다음 실행에서 같은 프로필로 관리 페이지에 가자 https://www.tistory.com/auth/login?redirectUrl=...로 튕겼다. 프로필이 저장되지 않은 것도 아니었다. 쿠키를 덤프해 보니 22개가 살아 있었다.
티스토리 쿠키는 세션 쿠키, 카카오 쿠키는 영속 쿠키였다
쿠키를 도메인별로 나눠 만료 시각을 보니 답이 그대로 드러났다.
.www.tistory.com __T_ expires=-1
.www.tistory.com __T_SECURE expires=-1
.kakao.com _kau expires=1820477621 (2027년)
.kakao.com _kawlt expires=1791544094 (2026년 10월)
Playwright가 expires=-1로 표시하는 것은 만료 시각이 없는 쿠키, 곧 세션 쿠키다. MDN은 "Max-Age나 Expires 속성이 없는 세션 쿠키는 현재 세션이 끝날 때 삭제된다"고 정의한다. 티스토리의 로그인 토큰 __T_가 바로 이 종류였다. 브라우저를 닫는 순간 사라지도록 설계된 것이다.
반면 카카오 계정 인증 쿠키 _kau는 2027년까지 유효한 영속 쿠키였다. 즉 "티스토리에는 로그아웃됐지만 카카오에는 로그인돼 있는" 상태다. 사람이 브라우저에서 겪는 일과 같다. 티스토리에 다시 들어가면 로그인 화면이 뜨지만, 카카오 버튼을 누르면 비밀번호 없이 바로 들어가진다.
MDN은 한 가지 단서를 더 단다. "브라우저가 세션 복원을 쓰면 세션 쿠키가 무한정 남을 수 있다." 일반 크롬은 창을 다시 열 때 세션을 복원하므로 사용자는 이 문제를 잘 못 느낀다. Playwright가 띄우는 브라우저는 매번 새 세션이라 복원이 없다. 자동화에서만 도드라지는 문제인 이유다.
카카오 SSO 버튼 두 번으로 세션을 되살린다
원인이 명확하니 해결은 사람이 하는 그대로다. 로그인 화면에서 "카카오계정으로 로그인"을 누르고, 카카오 간편로그인 화면에서 저장된 계정을 누른다.

def ensure_session(page, blog_url):
page.goto(f"{blog_url}/manage/newpost/")
if "/auth/login" not in page.url:
return True
page.click("a.link_kakao_id") # 카카오계정으로 로그인
page.wait_for_load_state("domcontentloaded")
if "accounts.kakao.com" in page.url:
page.locator("a.wrap_profile") \
.filter(has_not_text="새로운 계정").first.click()
page.wait_for_load_state("domcontentloaded")
page.goto(f"{blog_url}/manage/newpost/")
return "login" not in page.url
간편로그인 화면에는 저장된 계정과 "새로운 계정으로 로그인"이 같은 a.wrap_profile 클래스로 나열되므로, 텍스트로 후자를 걸러내야 한다. 이 함수를 모든 브라우저 작업의 첫 단계로 두자 두 번째 실행부터는 사람 개입 없이 통과했다. headless 모드에서도 같았다.
세션 쿠키를 영속으로 바꾸는 편법은 쓰지 않았다
다른 길도 있었다. Playwright의 storage_state()로 쿠키를 JSON에 저장한 뒤, expires 값을 미래 시각으로 고쳐서 다시 넣는 것이다. 세션 쿠키를 영속 쿠키로 둔갑시키는 셈이다.
이 방법을 버린 이유는 두 가지다. 첫째, 서버가 그 토큰을 언제까지 유효하다고 볼지는 클라이언트가 정하는 게 아니다. 쿠키를 오래 붙들어도 서버 쪽 세션이 끝나면 어차피 튕긴다. 둘째, 서비스가 세션 쿠키로 설계한 데는 이유가 있다. 브라우저를 닫으면 로그아웃되게 하려는 의도를 우회하는 것은 나중에 계정 보호 로직과 충돌할 여지를 만든다.
카카오 SSO를 다시 타는 방식은 서비스가 사용자에게 열어둔 정식 경로를 그대로 쓴다. 카카오 인증 쿠키가 만료되는 2027년이 오면 사람이 한 번 더 로그인하면 된다. 그때는 bgp login 명령이 브라우저를 띄우고 로그인 완료를 폴링으로 감지한다. 로그인만 사람이 하고 나머지는 전부 자동인 구조가 이렇게 완성됐다.
참고 자료
- Using HTTP cookies — MDN — 세션 쿠키와 영속 쿠키의 정의, 세션 복원에 관한 단서
- Authentication — Playwright Python —
storage_state로 로그인 상태를 저장·재사용하는 방법과 한계 - 티스토리 Open API 종료 안내 — 브라우저 자동화 외에 길이 없는 배경
'IT' 카테고리의 다른 글
| 티스토리 이미지 업로드 URL 만료, 서명 주소를 저장하면 안 되는 이유 (0) | 2026.09.12 |
|---|---|
| 주니어 개발자 채용이 줄었다는 말의 진짜 의미 (0) | 2026.09.12 |
| AI 코딩 에이전트 생산성, 90%가 쓰는데 왜 일정은 그대로인가 (0) | 2026.09.11 |
| Playwright로 티스토리 글 올리기, 본문이 빈 채 저장되던 이유 (4) | 2026.09.10 |
| D램 가격 4배 폭등, 서버 비용은 어디까지 오르나 (0) | 2026.09.10 |