본문 바로가기
Python/파이썬 문법, 함수, 모듈 등

[Python] SSH 터널링, pymysql 설명과 사용 방법, %s(플레이스홀더) 사용법 sshtunnel, pymysql

by dong_su 2024. 5. 29.

SSH 터널링이란?

사용 이유는 보안과 네트워크 접근성을 향상시키기 위함이며, 주로 데이터베이스 서버가 내부 네트워크에 위치하여 외부에서 직접 접근할 수 없는 경우에 사용됩니다. SSH 터널링은 외부에서 안전하게 내부 서버에 접근할 수 있도록 허용해주는 메커니즘입니다. 외부 클라이언트는 SSH 프로토콜을 통해 중간 서버(터널 서버)에 접속한 후, 해당 서버를 통해 내부 서버에 접근할 수 있습니다. 이를 통해 데이터베이스와 같은 중요한 서비스에 대한 보안을 강화하고, 외부에서 안전하게 접근할 수 있도록 합니다.

 

pymysql이란?

Python 코드에서 MySQL 데이터베이스에 쉽게 접근하고 데이터를 처리할 수 있습니다. 이 라이브러리는 MySQL 서버와의 통신을 가능하게 하므로, 데이터베이스와의 상호작용이 필요한 다양한 응용 프로그램에서 사용됩니다.


사용하기 위해 설치할 모듈

pip install pymysql
pip install sshtunnel

 

 

사용 예제)

import pymysql  
import pymysql.cursors  
from sshtunnel import SSHTunnelForwarder  # SSH 터널링을 위한 모듈입니다.

# SSH 터널링을 통해 MySQL 데이터베이스에 연결하는 예제입니다.
with SSHTunnelForwarder("SSH 호스트", ssh_username="SSH 사용자명", ssh_password="SSH 비밀번호", remote_bind_address=('MySQL 호스트', 3306)) as tunnel:
    try:
        # SSH 터널을 통해 MySQL 데이터베이스에 연결합니다.
        conn = pymysql.connect(host="127.0.0.1",  # 로컬호스트로 연결합니다.
                               user="MySQL 사용자명",  # MySQL 사용자명
                               password='MySQL 비밀번호',  # MySQL 비밀번호
                               database='데이터베이스명',  # 사용할 데이터베이스명
                               port=tunnel.local_bind_port,  # 로컬 포트를 지정
                               charset="utf8")  # 문자 인코딩을 utf-8로 설정

        # 커서 객체를 생성, DictCursor는 결과를 딕셔너리 형태로 반환하게 함
        cursor = conn.cursor(pymysql.cursors.DictCursor)

        query = "SELECT * FROM 테이블명 WHERE 컬럼명 = %s"

	record = (%s에 해당하는 데이터, )

	# execute()의 두번째 인자는 튜플 또는 리스트 타입이어야 함
        cursor.execute(query, record)

        result = cursor.fetchall()

        for row in result:
            print(row)

    except Exception as e:
        print(f"error : {str(e)}")

    finally:
        # 커서와 연결을 닫습니다.
        if cursor:
            cursor.close()
        if conn:
            conn.close()

 

추가 설명

1. 위 코드의 record = (%s, ) 부분

-> execute()의 두번째 인자는 튜플 or 리스트 타입이어야 하기 때문에 ,가 있다

 

2. %s는 플레이스홀더

-> 쿼리문에 값을 안전하게 삽입하기 위해 사용(SQL 인젝션 방지)

-> %s에 해당하는 값을 execute()의 두번째 인자에 넣으면 된다. 이때 데이터베이스 라이브러리가 해당 값을 이스케이프 처리하여 작동