Selenium에서 쿠키를 활용해 로그인 우회하기

자동화 테스트를 수행할 때, 특히 관리자 페이지와 같은 인증이 필요한 웹 애플리케이션을 다룰 경우 매번 로그인 과정을 거치는 것은 비효율적입니다. 더불어 CAPTCHA나 2차 인증과 같은 보안 절차가 추가되면 자동화가 더욱 어려워집니다. 이러한 문제를 해결하기 위해 Selenium을 사용하면서도 로그인 단계를 우회하는 방법으로 세션 쿠키(Session Cookie) 재사용 기법이 널리 활용됩니다.

웹 애플리케이션은 사용자의 로그인 상태를 서버 세션과 클라이언트 쿠키 간의 매핑을 통해 유지합니다. 즉, 유효한 세션 식별자가 포함된 쿠키를 브라우저가 보유하고 있다면, 별도의 인증 없이도 시스템은 해당 사용자를 인증된 상태로 인식합니다. Selenium은 기본적으로 새로운 브라우저 세션을 생성하므로 기존 쿠키를 상속하지 않지만, WebDriver가 제공하는 API를 통해 쿠키를 직접 주입함으로써 이 상태를 모방할 수 있습니다.

수동으로 쿠키 추출 후 주입

먼저 수작업으로 정상 로그인을 수행한 후, 개발자 도구의 Network 탭에서 특정 요청의 Cookie 헤더 또는 Response로 설정된 Set-Cookie 값을 확인합니다. 일반적으로 PHPSESSID, JSESSIONID, 또는 커스텀 이름(예: ECSCP_ID)의 쿠키가 세션 키로 사용됩니다.

Selenium WebDriver는 다음과 같은 쿠키 제어 메서드를 제공합니다:

  • get_cookies(): 현재 도메인의 모든 쿠키 조회
  • get_cookie(name): 특정 이름의 쿠키 값 조회
  • delete_cookie(name): 특정 쿠키 삭제
  • delete_all_cookies(): 모든 쿠키 제거
  • add_cookie(cookie_dict): 새 쿠키 추가 (딕셔너리 형식)

쿠키 추가 시에는 최소한 namevalue 필드가 필요하며, 필요에 따라 domain, path, secure, httpOnly 등을 지정할 수 있습니다. 단, 반드시 동일한 도메인에 속하는 페이지를 먼저 로드한 후에 add_cookie()를 호출해야 하며, 그렇지 않으면 UnableToSetCookieException 오류가 발생합니다.

코드 예제: 정적 쿠키 주입

from selenium import webdriver
import time

driver = webdriver.Chrome()
login_url = 'http://example.com/admin/index.php'

# 사전에 획득한 세션 쿠키
session_cookie = {
    'name': 'ECSCP_ID',
    'value': '7406d5a6f0c5bdfbebcc29b4e41cea9731d9e9f0',
    'path': '/',
    'domain': 'example.com'
}

try:
    driver.get(login_url)  # 동일 도메인 페이지 로드 필수
    driver.add_cookie(session_cookie)
    driver.refresh()  # 재로드하여 인증 상태 반영
    time.sleep(3)
finally:
    driver.quit()

Requests와 연동해 동적 쿠키 발급

수동으로 추출한 쿠키는 만료될 수 있으므로, 자동화 스크립트 내에서 로그인 요청을 프로그래밍 방식으로 처리하고 그 결과로 얻은 쿠키를 Selenium에 전달하는 것이 이상적입니다. Python의 requests 라이브러리는 세션 관리 기능을 제공하여 이를 용이하게 해줍니다.

설치

pip install requests

코드 예제: 로그인 요청 후 쿠키 전달

import requests
from selenium import webdriver
import time

def fetch_session_cookie(username, password):
    session = requests.Session()
    login_endpoint = 'http://example.com/admin/privilege.php'
    payload = {
        'username': username,
        'password': password,
        'act': 'signin'
    }

    response = session.post(login_endpoint, data=payload, allow_redirects=False)
    
    # 세션 ID 쿠키 추출
    sid = session.cookies.get('ECSCP_ID')
    if not sid:
        raise Exception("로그인 실패: 세션 쿠키를 받지 못함")
    
    return {
        'name': 'ECSCP_ID',
        'value': sid,
        'domain': 'example.com',
        'path': '/'
    }

# 메인 자동화 흐름
driver = webdriver.Chrome()
admin_page = 'http://example.com/admin/index.php'

try:
    driver.get(admin_page)  # 도메인 접속
    cookie = fetch_session_cookie('admin', 'password123')
    driver.add_cookie(cookie)
    driver.get('http://example.com/admin/order.php?act=list')  # 목표 페이지 이동
    time.sleep(3)
finally:
    driver.quit()

이 방식은 로그인 인증 정보를 코드 내에 고정하는 대신, 실행 시점에 유효한 세션을 확보하므로 유지보수성과 안정성이 향상됩니다. 여러 개의 쿠키가 필요한 경우에도 session.cookies에서 반복문을 통해 모두 추출한 후 각각 add_cookie()로 삽입할 수 있습니다.

태그: selenium python web-automation cookies requests

5월 24일 15:55에 게시됨