학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.05.11)

cd-record 2026. 5. 12. 00:32

 

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)의 내용을 서버가 알 수 있게 등록

  1. WinSCP로 서버에 접속
  2. 서버의 사용자 홈 디렉토리(보통 /home/유저명/)에 .ssh 폴더가 있는지 확인. (없으면 생성)
  3. id_rsa.pub 파일의 내용을 복사하여 서버의 .ssh/authorized_keys 파일 안에 붙여넣기
    • 기존 내용이 있다면 다음 줄에 추가합니다.
    • 파일이 없다면 새로 만들어서 내용을 저장합니다.

* WinSCP 로그인에 키로 접혹하는 법

로그인에서 고급탭 >  개인 키 파일 > 확장자 모든 개인 키 파일 선택 > id_rsa 선택

3단계: VS Code에서 접속 설정하기

매번 키 경로를 입력하지 않도록 SSH 설정 파일(config)을 편집합니다.

  1. VS Code에서 F1 키를 누르고 "Remote-SSH: Open SSH Configuration File..."을 선택
  2. 사용자 폴더의 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)처럼 보안이 중요한 서버를 내부망에 숨길 때 유용합니다.
      • 내부망 구성 및 프로젝트 환경 복제
        • 프로젝트를 진행할 때 여러 대의 서버가 서로 통신해야 하는 경우가 많습니다.
        • 독립된 환경: 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__))을 의미

 

느낀점

 

가상 머신에서 두 개의 서버를 만들어서 하나는 웹서버, 하나는 DB 서버로 구성하고 NAT네트워크로 서로 연결하여 웹사이트연결하는 작업까지 해보았다. 구성도와 흐름을 파악해서 서비스들이 어떻게 돌아가는 지 파악하는 것이 중요하다고 느껴졌다.

 

 

 

 

 

 

 

——————————————————————————

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.