RSA
1단계: 내 컴퓨터에서 키 쌍(Key Pair) 생성하기
PowerShell을 열고 아래 명령어를 입력
ssh-keygen -t rsa
저장 위치: C:\Users\사용자\.ssh\ ip_rsa, ip_rsa.pub(서버에 보내버리는 키)
(id_rsa : 개인 키 (Private Key), ip_rsa.pub: 공개키 (Public key))
2단계: 서버에 공개키 등록하기 (WinSCP 활용)
생성한 공개키(id_rsa.pub)의 내용을 서버가 알 수 있게 등록
- WinSCP로 서버에 접속
- 서버의 사용자 홈 디렉토리(보통 /home/유저명/)에 .ssh 폴더가 있는지 확인. (없으면 생성)
- id_rsa.pub 파일의 내용을 복사하여 서버의 .ssh/authorized_keys 파일 안에 붙여넣기
- 기존 내용이 있다면 다음 줄에 추가합니다.
- 파일이 없다면 새로 만들어서 내용을 저장합니다.
* WinSCP 로그인에 키로 접혹하는 법
로그인에서 고급탭 > 개인 키 파일 > 확장자 모든 개인 키 파일 선택 > id_rsa 선택
3단계: VS Code에서 접속 설정하기
매번 키 경로를 입력하지 않도록 SSH 설정 파일(config)을 편집합니다.
- VS Code에서 F1 키를 누르고 "Remote-SSH: Open SSH Configuration File..."을 선택
- 사용자 폴더의 config 파일을 선택하고 아래와 같이 작성

Ubuntu VM 구성 (Web Server + DB Server)
- 구성

- 목적: DB의 보안 강화
*mariaDB 삭제
sudo apt purge mariadb-server mariadb-client mariadb-common
* NAT 네트워크 설정
- NAT 네트워크: 가상 머신 소프트웨어(VirtualBox, VMware 등)가 내부적으로 가상 공유기를 하나 만드는 것
- 구조: 실제 PC(호스트)는 외부와 통신하는 하나의 공인 IP를 가지고 있고, 그 안에 있는 가상머신들은 가상 공유기가 할당해 준 사설 IP(예: 10.0.2.x)를 가집니다.
- 특징: 가상머신이 외부로 나갈 때는 실제 PC의 IP를 빌려서 나가지만, 외부에서는 가상머신의 사설 IP를 직접 볼 수 없습니다.
- 왜 NAT 네트워크를 사용하는 가?
- IP 주소의 효율적 관리
- 공인 IP(Public IP)는 개수가 제한되어 있습니다. 모든 가상머신에 각각 공인 IP를 할당하기 어렵기 때문에, NAT를 통해 하나의 IP 아래 여러 대의 VM을 묶어 인터넷을 사용할 수 있게 합니다.
- 보안 강화 (외부로부터의 격리)
- NAT 네트워크 안에 있는 가상머신들은 외부 인터넷에서 직접 접속할 수 없는 상태가 됩니다.(접속을 위해 포트 포워딩 사용)
- 가상머신 내부에서는 인터넷 업데이트나 패키지 다운로드가 가능하지만, 외부 해커가 가상머신의 사설 IP로 직접 침입하는 것은 차단됩니다.
- 이는 앞서 구성하신 DB 서버(hancom2)처럼 보안이 중요한 서버를 내부망에 숨길 때 유용합니다.
- IP 주소의 효율적 관리
-
- 내부망 구성 및 프로젝트 환경 복제
- 프로젝트를 진행할 때 여러 대의 서버가 서로 통신해야 하는 경우가 많습니다.
- 독립된 환경: NAT 네트워크를 쓰면 외부 네트워크 환경이 바뀌더라도(카페 와이파이 -> 집 와이파이), 가상머신들끼리 설정해둔 내부 IP(예: 10.0.2.5, 10.0.2.6)는 변하지 않고 유지됩니다.
- 서버 간 통신: 웹 서버와 DB 서버가 서로 통신할 때 외부 노출 없이 안전하게 데이터를 주고받을 수 있습니다
- 내부망 구성 및 프로젝트 환경 복제
- NAT 네트워크 설정
- 어댑터를 nat 네트워크로 변경
- 네트워크 정보 확인
- 설정파일 열기(및 수정)
- 설정 파일 보안 강화
- 패키지 목록 업데이트 및 설치
- 서비스 활성화 및 자동 실행
- 적용
#네트워크 확인
ip a
#설정파일 열기
sudo nano /etc/netplan/01-netcfg.yaml
#내용 수정
#자동할당설정
network:
version: 2
renderer: networkd
ethernets:
enp0s8: # 위에서 확인한 인터페이스 이름
dhcp4: true
dhcp-identifier: mac # 이 줄을 추가하여 MAC 주소 기반으로 구분하게 함
#고정IP설정
network:
version: 2
renderer: networkd
ethernets:
enp0s8:
dhcp4: no
addresses:
- 10.0.2.16/24
routes:
- to: default
via: 10.0.2.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
#설정 파일 보안 강화
sudo chmod 600 /etc/netplan/*.yaml
#패키지 목록 업데이트 및 설치
sudo apt update
sudo apt install openvswitch-switch openvswitch-common
#서비스 활성화 및 자동 실행
sudo systemctl start openvswitch-switch
sudo systemctl enable openvswitch-switch
# 상태 확인
sudo systemctl status openvswitch-switch
#적용
sudo netplan apply
Flask 서비스 구동
Q. 리눅스 환경에서 Flask 애플리케이션을 systemd 서비스(Service)로 등록하는 이유?
- 한마디로 요약: "내가 일일이 신경 쓰지 않아도 서버가 알아서 돌아가게 하기 위해서"
1단계: 서비스 설정 파일 생성
리눅스 시스템이 관리할 수 있도록 서비스 정의 파일을 만듭니다.
- 명령어: sudo nano /etc/systemd/system/flask_app.service
- 파일 내용:
[Unit]
# 서비스에 대한 설명과 실행 시점 설정
Description=Flask Application
After=network.target # 네트워크가 연결된 후에 실행
[Service]
# 실행 계정 및 경로 설정
User=hancom
WorkingDirectory=/home/hancom/flask/0507/web2 # 앱 소스 위치
Environment="PATH=/home/hancom/flask/venv312/bin" # 가상환경(venv) 경로
ExecStart=/home/hancom/flask/venv312/bin/python app.py # 실행 명령어
[Install]
# 시스템이 다중 사용자 모드(정상 부팅)일 때 자동 실행되도록 설정
WantedBy=multi-user.target
2단계: 시스템에 서비스 반영 (데몬 재로딩)
새로운 설정 파일을 만들었으므로, 시스템(systemd)이 이를 인식하도록 업데이트합니다.
- 명령어: sudo systemctl daemon-reload
3단계: 서비스 시작 및 자동 실행 설정
이제 Flask 앱을 켜고, 서버가 꺼졌다 켜져도 자동으로 켜지게 예약합니다.
- 즉시 시작: sudo systemctl start flask_app
- 부팅 시 자동 시작 설정: sudo systemctl enable flask_app
구니콘 연결
Q. Gunicorn을 연결하는 이유?
- Flask 자체의 한계를 극복하고, 실제 사용자들이 접속할 수 있는 '운영 수준의 안정성'을 확보하기 위해서
- 1. Flask 서버의 한계 (Werkzeug의 성능)
- Flask를 실행할 때 사용하는 기본 서버(Werkzeug)는 개발용(Development Server)입니다.
- 1인용 도로: 기본 서버는 한 번에 하나의 요청만 처리하는 경우가 많아, 여러 명의 야구 팬이 동시에 접속하면 서버가 매우 느려지거나 멈출 수 있습니다.
- Gunicorn의 역할: Gunicorn은 WSGI(Web Server Gateway Interface) 서버로, 여러 개의 '일꾼(Worker)' 프로세스를 미리 띄워두어 여러 명의 요청을 동시에 처리할 수 있는 '다차선 도로' 역할을 합니다.
- 2. 안정성과 보안 (Robustness)
- 개발용 서버는 에러가 발생하면 서버 전체가 죽어버리는 경우가 많습니다.
- 자동 복구: Gunicorn은 특정 프로세스에 문제가 생겨도 다른 프로세스가 살아있어 서비스가 중단되지 않도록 관리합니다.
- 보안: 외부의 비정상적인 요청으로부터 Flask 애플리케이션을 직접 노출시키지 않고 한 번 보호해 주는 완충 지대 역할을 합니다.
1단계. 패키지 설치
먼저 서버 엔진인 Gunicorn과 비동기 처리를 도와주는 Gevent를 가상환경에 설치합니다.
pip install gunicorn gevent
2. 서비스 설정 파일 작성 (flask_app.service)
Gunicorn을 사용하도록 ExecStart 부분을 수정한 설정입니다.
- 명령어: sudo nano /etc/systemd/system/flask_app.service
- 파일 내용:
[Unit]
Description=Flask Application with Gunicorn and Gevent
After=network.target
[Service]
User=hancom
WorkingDirectory=/home/hancom/flask/0507/web2
Environment="PATH=/home/hancom/flask/venv312/bin"
# 핵심: Gunicorn 실행 옵션 상세 설명
ExecStart=/home/hancom/flask/venv312/bin/gunicorn \
--workers 3 \
--worker-class gevent \
--bind 0.0.0.0:5000 \
app:app
[Install]
WantedBy=multi-user.target
- 서비스 파일 내 Gunicorn 옵션 설명
- --workers 3: 구동할 프로세스(Worker) 개수입니다.
보통 (CPU 코어 개수 * 2) + 1을 공식으로 사용 - --worker-class gevent: 비동기 처리를 위해 gevent 엔진을 워커 클래스로 지정합니다.
- --bind 0.0.0.0:5000: 외부에서 5000번 포트로 접속할 수 있도록 바인딩합니다.
- app:app: 앞의 app은 파일명(app.py), 뒤의 app은 파일 내 정의된 Flask 인스턴스 이름(app = Flask(__name__))을 의미
- --workers 3: 구동할 프로세스(Worker) 개수입니다.
느낀점
가상 머신에서 두 개의 서버를 만들어서 하나는 웹서버, 하나는 DB 서버로 구성하고 NAT네트워크로 서로 연결하여 웹사이트연결하는 작업까지 해보았다. 구성도와 흐름을 파악해서 서비스들이 어떻게 돌아가는 지 파악하는 것이 중요하다고 느껴졌다.
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.05.13) (0) | 2026.05.13 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.05.12) (0) | 2026.05.12 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.08) (0) | 2026.05.08 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.07) (1) | 2026.05.07 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.06) (0) | 2026.05.07 |