엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기

이미지
엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기 (완성 코드 공개) "매크로가 포함된 파일을 다른 사람에게 보내면 보안 경고 때문에 매크로 사용 설정을 매번 따로 해야 한다", "VBA 코드가 회사 PC마다 다르게 작동해서 디버깅이 어렵다", "매크로를 쓰는 동료가 퇴사하면 그 파일을 아무도 수정하지 못한다"… VBA 매크로는 엑셀 안에서 바로 실행되는 장점이 있지만, 보안 정책으로 차단되거나, 회사 PC마다 설정이 달라 오작동하거나, 코드 관리가 어려운 한계가 있습니다. 이 글에서는 이 블로그에서 지금까지 소개한 파이썬 코드들이 VBA의 어떤 기능을 대체할 수 있는지 비교하고, 대표적인 매크로 작업을 파이썬으로 구현하는 방법을 소개합니다. VBA 매크로 vs 파이썬 비교 VBA 매크로 파이썬 실행 환경 엑셀 안에서만 동작 독립적으로 어디서나 동작 보안 경고 매번 발생, 차단 가능 해당 없음 배포 파일에 코드 포함 스크립트 파일만 공유 디버깅 엑셀 VBA 편집기 사용 다양한 코드 에디터 사용 가능 다른 프로그램 연동 제한적 (Win API 필요) 매우 풍부함 (이메일, 웹, DB 등) 버전 관리(깃 등) 거의 불가능 일반적인 코드처럼 관리 가능 배우는 난이도 엑셀에 특화된 문법 범용 프로그래밍 언어, 활용도 넓음 💡 언제 VBA가 더 나을까: 엑셀을 열자마자 버튼 클릭으로 즉시 실행하고 싶거나, 엑셀 전용 UI(사용자 정의 양식)가 필요한 경우는 VBA가 더 간단할 수 있습니다. 하지만 안정성, 보안, 확장성을 고려하면 대부분의 반복 작업은 파이썬이 더 유리합니다. 대표 매크로 작업 1 — 여러 시트 합치기 VBA로 흔히 작성하는 "모...

사내 그룹웨어 매일 로그인 끝! 파이썬으로 웹사이트 자동 로그인하기

사내 그룹웨어 매일 로그인 끝! 파이썬으로 웹사이트 자동 로그인하기 (완성 코드 공개)

파이썬으로 웹사이트에 자동으로 로그인하는 모습


"매일 아침 사내 그룹웨어에 로그인해서 출근 체크를 한다", "인트라넷에 로그인한 후 매번 같은 메뉴를 클릭해서 데이터를 확인한다", "여러 웹사이트에 로그인해서 정보를 확인하는 루틴이 매일 반복된다"…

이전 게시글 pyautogui 윈도우 자동화 편에서는 좌표 기반으로 마우스·키보드를 제어하는 방법을 소개했습니다. 웹사이트 자동화에는 Selenium이라는 전용 도구가 훨씬 안정적입니다. 브라우저 창의 위치나 크기가 바뀌어도 HTML 요소를 기준으로 정확하게 찾아서 클릭하기 때문입니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

웹 자동화에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install selenium webdriver-manager

selenium은 브라우저를 코드로 제어하는 표준 라이브러리입니다. webdriver-manager는 크롬 브라우저에 맞는 드라이버 파일을 자동으로 다운로드하고 관리해줍니다. 별도로 드라이버를 수동 설치할 필요가 없습니다.

⚠️ 중요한 주의사항: 이 코드는 본인이 권한을 가진 계정(사내 시스템, 개인 업무 계정)에만 사용해야 합니다. 타인의 계정이나 권한 없는 사이트에 자동 로그인을 시도하는 것은 명백한 불법 행위입니다. 또한 비밀번호를 코드에 평문으로 저장하는 것은 보안 위험이 있으므로, 실제 운영 시에는 아래 응용 섹션의 환경 변수 분리 방법을 꼭 적용하세요.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, web_login.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

# ① 설정
LOGIN_URL  = "https://intranet.example.com/login"   # ← 로그인 페이지 URL
USERNAME   = "내아이디"        # ← 로그인 아이디
PASSWORD   = "내비밀번호"      # ← 로그인 비밀번호
HEADLESS   = False             # ← True: 화면 안 보이게 백그라운드 실행 / False: 화면 보면서 확인

# ② 크롬 브라우저 옵션 설정
options = webdriver.ChromeOptions()
if HEADLESS:
    options.add_argument("--headless=new")
options.add_argument("--start-maximized")
options.add_argument("--disable-notifications")

# ③ 브라우저 실행 (드라이버 자동 설치)
service = Service(ChromeDriverManager().install())
driver  = webdriver.Chrome(service=service, options=options)
wait    = WebDriverWait(driver, 10)   # 최대 10초까지 요소가 나타날 때까지 대기

try:
    # ④ 로그인 페이지 접속
    print("  ▶ 로그인 페이지 접속 중...")
    driver.get(LOGIN_URL)

    # ⑤ 아이디 입력창 찾아서 입력 (id 속성이 "userId"라고 가정)
    id_input = wait.until(EC.presence_of_element_located((By.ID, "userId")))
    id_input.clear()
    id_input.send_keys(USERNAME)
    print("  ✔ 아이디 입력 완료")

    # ⑥ 비밀번호 입력창 찾아서 입력 (id 속성이 "password"라고 가정)
    pw_input = driver.find_element(By.ID, "password")
    pw_input.clear()
    pw_input.send_keys(PASSWORD)
    print("  ✔ 비밀번호 입력 완료")

    # ⑦ 로그인 버튼 클릭 (id 속성이 "loginBtn"이라고 가정)
    login_btn = driver.find_element(By.ID, "loginBtn")
    login_btn.click()
    print("  ✔ 로그인 버튼 클릭")

    # ⑧ 로그인 완료 대기 (메인 페이지의 특정 요소가 나타날 때까지)
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, "main-dashboard")))
    print("  ✔ 로그인 성공! 메인 페이지 진입 확인")

    time.sleep(2)   # 결과 확인용 대기 (필요시 제거 가능)

except Exception as e:
    print(f"  ✘ 오류 발생: {e}")

finally:
    # ⑨ 브라우저 종료 (HEADLESS=False면 결과 확인 후 직접 닫아도 됨)
    if HEADLESS:
        driver.quit()
    print("\n✅ 완료!")

3단계: 로그인 요소의 ID 찾는 방법

코드의 By.ID, "userId" 같은 부분은 실제 웹사이트의 HTML 구조에 맞게 수정해야 합니다. 찾는 방법은 간단합니다.

  1. 로그인하려는 웹사이트를 크롬 브라우저로 엽니다.
  2. 아이디 입력창에서 마우스 오른쪽 클릭 → "검사"를 선택합니다.
  3. 개발자 도구가 열리며 해당 입력창의 HTML 코드가 강조 표시됩니다.
  4. <input id="userId" ...> 처럼 id 속성이 있다면 그 값을 코드에 사용합니다.
  5. id가 없다면 name 속성을 사용하거나, By.CSS_SELECTOR로 클래스명을 활용합니다.
# id가 없을 때 다른 방법들
driver.find_element(By.NAME, "user_id")              # name 속성 사용
driver.find_element(By.CSS_SELECTOR, "input.id-box")  # CSS 클래스 사용
driver.find_element(By.XPATH, "//input[@placeholder='아이디']")  # XPath 사용

4단계: 실행 방법

  1. 코드 ① 설정의 LOGIN_URL, USERNAME, PASSWORD를 입력합니다.
  2. 3단계 방법으로 실제 사이트의 아이디·비밀번호 입력창, 로그인 버튼의 ID를 확인하고 코드 ⑤~⑦을 수정합니다.
  3. 터미널에서 아래 명령어로 실행합니다:
python web_login.py

정상 실행 시 크롬 브라우저가 자동으로 열리고 로그인이 진행되며, 터미널에 이렇게 출력됩니다:

  ▶ 로그인 페이지 접속 중...
  ✔ 아이디 입력 완료
  ✔ 비밀번호 입력 완료
  ✔ 로그인 버튼 클릭
  ✔ 로그인 성공! 메인 페이지 진입 확인

✅ 완료!

5단계: 자주 발생하는 오류와 해결법

오류 1: NoSuchElementException

코드에 입력한 ID나 CSS 선택자가 실제 웹사이트와 다른 경우입니다. 3단계 방법으로 정확한 요소 정보를 다시 확인하세요. 사이트가 iframe(웹페이지 안의 또 다른 웹페이지) 구조라면 driver.switch_to.frame()으로 먼저 진입해야 합니다.

오류 2: TimeoutException

요소가 10초 안에 나타나지 않은 경우입니다. 인터넷 속도가 느리거나 페이지 로딩이 오래 걸리면 WebDriverWait(driver, 20)처럼 대기 시간을 늘려보세요.

오류 3: 로그인 버튼을 눌렀는데 캡차(자동입력방지문자)가 나타남

보안을 위해 캡차가 적용된 사이트는 완전 자동화가 어렵습니다. 이런 경우 HEADLESS = False로 설정해 직접 캡차만 입력하고, 나머지 과정은 자동화하는 반자동 방식을 사용하세요.


응용: 비밀번호를 코드에서 분리해 안전하게 관리하기

비밀번호를 코드에 직접 입력하는 것은 보안상 위험합니다. 환경 변수나 별도 설정 파일로 분리하는 방법입니다.

import os
from dotenv import load_dotenv

load_dotenv()   # .env 파일에서 환경 변수 불러오기

USERNAME = os.getenv("LOGIN_ID")
PASSWORD = os.getenv("LOGIN_PASSWORD")

같은 폴더에 .env 파일을 만들고 아래처럼 작성합니다:

LOGIN_ID=내아이디
LOGIN_PASSWORD=내비밀번호

pip install python-dotenv로 설치 후 사용하며, .env 파일은 절대 다른 사람과 공유하거나 깃허브에 올리지 않아야 합니다.

💡 이전 게시글과 결합하면: 로그인 후 웹 데이터 자동 수집 편의 코드와 결합하면 로그인이 필요한 사내 시스템에서도 데이터를 자동으로 수집할 수 있고, 스케줄러 편과 결합하면 매일 아침 자동으로 출근 체크까지 처리할 수 있습니다.

핵심 요약

  • 준비물: Python + selenium + webdriver-manager 설치 (pip install selenium webdriver-manager)
  • 설정: LOGIN_URL, USERNAME, PASSWORD 입력 후 실제 사이트의 요소 ID로 코드 수정
  • 요소 찾기: 브라우저 개발자 도구(마우스 오른쪽 클릭 → 검사)로 ID·name 확인
  • 실행: 터미널에서 python web_login.py 입력
  • 보안: 비밀번호는 .env 파일로 분리, 본인 권한 있는 계정에만 사용

이 코드를 응용하면 로그인 후 특정 메뉴를 클릭해 데이터를 조회하거나, 여러 사이트에 순차적으로 로그인하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁