카카오 로그인 세션이 브라우저 닫으면 풀리는 이유와 자동 재로그인

2026. 9. 11. 13:00·IT
728x90
반응형

티스토리 자동화에서 로그인은 자동화하지 않는 것이 정석이다. 카카오 계정 로그인은 캡차와 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 종료 안내 — 브라우저 자동화 외에 길이 없는 배경
728x90
반응형

'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
'IT' 카테고리의 다른 글
  • 티스토리 이미지 업로드 URL 만료, 서명 주소를 저장하면 안 되는 이유
  • 주니어 개발자 채용이 줄었다는 말의 진짜 의미
  • AI 코딩 에이전트 생산성, 90%가 쓰는데 왜 일정은 그대로인가
  • Playwright로 티스토리 글 올리기, 본문이 빈 채 저장되던 이유
밍글링글링
밍글링글링
mingling - 밍글링, 밍글밍글링. 코드와 어우러지다. IT/ 프로그래밍/소스
    반응형
    250x250
  • 밍글링글링
    mingling
    밍글링글링
  • 전체
    오늘
    어제
    • 밍글링글링 (407) N
      • Flutter (2)
      • 일상생활 (8)
        • 리뷰 (1)
        • 생활정보 (4)
        • 맛집 (0)
        • 여행 (0)
        • 모든정보 (3)
      • JAVA (126)
        • 개념 (6)
        • 예제 (115)
        • Exception (2)
      • C (1)
        • C (1)
        • C++ (0)
        • C# (0)
      • JS (29)
        • JavaScript (18)
        • JQuery (5)
        • AJax (0)
        • NODE.JS (6)
        • Angular.JS 2.0 (0)
      • WEB (87)
        • HTML (6)
        • CSS (61)
        • JSP (20)
        • JSTL (0)
      • FrameWork (8)
        • Spring (8)
        • BootStrap (0)
        • MyBATIS (0)
        • JUnit (0)
      • 외부 라이브러리 (5)
      • 공유 소스 관리 (5)
        • Git (5)
        • SVN (0)
      • 빅데이터 프로그래밍 (37)
        • Python (37)
        • R Programming (0)
      • DB (7)
        • ORACLE (0)
        • MySql (6)
      • Development Tools (7)
        • StarUML (0)
        • eXERD (0)
        • Eclipse (4)
      • SKILL (6)
        • Migration (0)
        • Security (6)
      • MicroSoft (0)
        • Excel (0)
        • Word (0)
      • Android (0)
      • Server (21)
        • Ubuntu (5)
        • Linux (15)
      • IOS (0)
      • XML (0)
      • 미디어 (0)
      • 공지사항 (3)
      • NETWORK (1)
      • 게임 (4)
        • 피파 (1)
        • 리니지M (0)
        • 배틀그라운드 (1)
        • 듀랑고 (2)
      • 세상 이슈 (6)
      • 일렉트론 (0)
      • 대회 소식 (4)
      • 업무 (2)
      • Express, Vue (6)
      • docker (11)
      • svelte (3)
      • 블록체인 (1)
      • IT (10) N
      • Rust (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    svelte
    에디터 팁
    css tb
    VS Code 팁
    css perspective
    브라우저 자동화
    SSL 인증서
    Node
    jsp include
    css list
    vue 설치
    React Compiler
    자바 exception
    java casting
    AI 코딩 에이전트
    자바 생성자
    docker
    nginx ssl 적용
    vue cli
    servlet class
    spring java
    vscode
    API 설계
    Rust lang
    gitlab 설치
    css table
    ubuntu
    오류
    mysql db
    티스토리 자동화
    자바 클래스
    리눅스 설치
    css float
    Extension Bisect
    nginx ssl 설정
    자바 객체 지향
    css transition
    클론코딩
    jsp parameter
    자바 for문
    자바 배열
    rust linux
    css block
    러스트
    Java Array
    프런트엔드
    ssl 인증서 발급
    proxy pass
    lang rust
    nginx
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
밍글링글링
카카오 로그인 세션이 브라우저 닫으면 풀리는 이유와 자동 재로그인
상단으로

티스토리툴바