1. 구입한 도메인을 서버에 연결하기

  미니 PC에 Nginx를 설치하고 도메인 사이트에서 구입한 닷컴 도메인을 연결했습니다. 먼저 도메인을 서버에 연결하기 위해서는 도메인을 구입한 사이트의 DNS 관리 페이지에 들어가야 합니다.

 

  저는 가비아에서 구매를 해서 가비아를 기준으로 설명드리겠습니다. 먼저 DNS 정보 메뉴에 들어가서 DNS 관리 버튼을 클릭합니다.

 

  구매한 도메인을 체크하고 DNS 설정을 클릭합니다.

 

  레코드 추가를 눌러서 호스트는 www, @, 값/위치는 서버의 ip주소를 입력하고 TTL은 3600으로 설정하고 저장을 누릅니다. @는 도메인 주소를 입력했을 때 서버의 주소로 접속하기 위해서 설정하고, www는 www가 붙은 도메인 주소로 접속하기 위해서 설정해 줍니다. TTL은 DNS 서버가 정보를 캐시에 유지하는 시간을 의미하는데 TTL을 너무 낮게 설정하면 DNS 서버가 자주 갱신 요청을 해야 하므로 서버의 부하가 증가하고, TTL을 길게 설정하면 도메인 설정을 변경했을 때 변경사항이 적용되는데 오래 걸리므로 일반적으로 3600(1시간)으로 설정한다고 합니다.


2. Nginx 설정 수정하기

sudo vim /etc/nginx/sites-available/<도메인 이름>.conf

 

  도메인 사이트에서 DNS 설정이 끝났으면 서버의 Nginx 설정 파일을 수정해줘야 합니다. 위 명령어를 입력해서 nginx의 sites-available 폴더에 파일을 생성해 줍니다. 설정파일이라는 것을 구분하기 위해 '.conf'를 붙이는 것일 뿐 생략해도 무방합니다.

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

 

   에디터가 열렸으면 i를 눌러서 insert mode에 진입해서 위 코드를 붙여 넣기 한 후에 server_name 부분에 구입한 도메인 주소를 입력해 주세요. 그리고 esc를 누른 후에 :wq를 입력하고 저장을 합니다.

sudo ln -s /etc/nginx/sites-available/<도메인 이름>.conf /etc/nginx/sites-enabled/

 

  편집이 끝났다면 위의 명령어를 입력해서 sites-enabled 폴더에 심볼릭 링크를 형성해 줍니다. 심볼릭 링크는 윈도우의 바로가기 같은 기능으로 sites-available 폴더에서는 nginx의 모든 설정 파일을 저장해 놓고, 서버에 직접 적용할 설정 파일만 sites-enabled 폴더에 심볼릭 링크를 연결해서 사용을 합니다. 이제 도메인 주소를 웹브라우저에 입력하면 서버에 연결이 될 것입니다.


3. HTTPS 적용을 위해 SSL/TLS 인증서 받기

sudo apt-get update
sudo apt-get install certbot
sudo apt-get install python3-certbot-nginx

 

  웹페이지에 HTTPS 적용을 하기 위해서는 먼저 인증서를 발급받아야 합니다. 우분투 버전이 18.04 이상이면 python3-certbot-nginx를 설치하면 되지만, 그보다 오래된 버전이라면 python-certbot-nginx를 설치해야 한다고 합니다.

sudo certbot --nginx -d example.com -d www.example.com

 

  위의 명령어에서 example.com 부분을 구매한 도매인으로 수정하고 실행하면 인증서 발급 절차가 시작됩니다. 이메일을 입력하라는 문구가 나오는데, 이메일을 입력하고 약관에 동의하면 인증서가 발급이 됩니다.

sudo vim /etc/nginx/sites-available/<도메인 이름>.conf

 

  인증서를 발급받은 후에 다시 conf 파일을 확인해 보면 자동으로 아래와 같이 수정된 것을 볼 수 있습니다.

server {
    root /var/www/html;
    index index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name example.com www.example.com;
    return 404; # managed by Certbot
}

 

  발급받은 인증서는 90일 이후에 만료되므로 cron 작업 스케줄러를 이용하여 자동으로 갱신되도록 하는 것이 좋습니다. 인증서를 갱신하기 위해서는 일시적으로 80번 포트를 열어주어야 하기 때문에 root 사용자의 crontab을 설정하겠습니다.

sudo crontab -e

 

  crontab -e를 입력하면 원하는 에디터를 설정하라는 문구가 나옵니다.

 

  저는 vim을 선호하기 때문에 2번을 선택했습니다.

0 0 * * * ufw allow 80 && /usr/bin/certbot renew --quiet && ufw deny 80

 

  에디터가 열렸다면 위와 같이 입력하고 저장해 줍니다.

 

  위와 같이 입력하면 매일 0시에 cerbot이 인증서를 갱신하도록 설정합니다. --quiet는 작업을 조용하게 진행하며, 오류가 없다면 로그를 남기지 않습니다. 만약 시간을 다르게 설정하고 싶다면 순서대로 시, 분, day of month(매일), mon(매월), day of week(요일) 값을 다르게 주어서 변경할 수 있습니다. 매일 명령어가 실행되어도 실제로 인증서 갱신 작업은 만료가 가까워질 때만 수행되므로 서버에 무리가 가지 않습니다. 인증서를 갱신할 때에는 80번 포트와 443 포트가 열려 있어야 하기 때문에 임시로 80번 포트를 열고 인증서 갱신이 완료되면 80번 포트를 닫도록 설정을 했습니다. 이 작업은 동기적으로 이루어져서 인증서 갱신이 완료된 후에 80번 포트가 닫힐 것입니다.

# 인증서 상태 확인
sudo certbot certificates

# 임시로 방화벽 비활성화 or 80번 포트 허용
sudo ufw disable / sudo ufw allow 80

# 인증서 갱신
sudo certbot renew

# 다시 방화벽 활성화 / 80번 포트 차단
sudo ufw enable / sudo ufw deny 80

 

  만약 수동으로 인증서 갱신을 진행하려면 위와 같은 단계로 진행하면 됩니다.


4. 방화벽 설정 변경하기

sudo ufw allow 'Nginx HTTPS'
sudo ufw reload
sudo ufw status

 

  마지막으로 http 포트인 80 포트의 접근을 막고, https 포트인 443번 포트로만 접속이 되도록 방화벽의 설정을 변경합니다.

1. SSH 설치, 포트 변경하기, 방화벽 등록

  서버에 우분투를 설치했으면, 외부에서 터미널을 이용해 접속을 할 수 있도록 SSH 설정을 해주어야 합니다. 먼저 터미널을 실행하고, 아래와 같이 SSH 서버를 설치해 줍니다.

sudo apt-get update
sudo apt-get install openssh-server

 

  SSH 기본 포트는 22번 포트인데 이 포트를 그대로 사용하는 것은 보안 상 좋지 않기 때문에 22번 포트가 아닌 다른 포트를 사용해 주는 것이 좋습니다. 포트를 변경하기 위해서 아래의 명령어를 이용해 ssh 설정 파일을 수정해 줍니다. 

sudo vim /etc/ssh/sshd_config

 

  저는 기본 vi 에디터보다 vim에디터를 선호하지만, vi나 nano를 이용해도 됩니다. 에디터가 실행되었으면 i를 눌러 insert 모드에 진입하고 기본포트가 적혀있는 #Port 22 아래에 원하는 포트번호를 입력합니다. 그다음 esc를 눌러서 insert 모드에서 빠져나온 후 :wq를 입력해서 저장을 해줍니다.

 

  포트 번호 수정이 완료되었다면 이제 SSH에 접속할 때 아래와 같이 '-p <포트번호>'를 붙여서 접속합니다.

ssh -p <포트 번호> username@ip주소

 

  마지막으로 방화벽을 활성화하고 설정한 SSH 포트를 허용해 줍니다.

sudo ufw enable
sudo ufw allow <포트 번호>
sudo ufw reload
sudo ufw status

 

  만약 서버의 ip 주소를 모르겠다면 net-tools를 설치한 후에 ifconfig 명령어를 통해서 확인할 수 있습니다.

sudo apt install net-tools
ifconfig

2. SSH 키 등록하고 비밀번호 접속 막기

  SSH 키를 생성해서 키를 가지고 있는 사용자만 접속할 수 있게 하면 로그인할 때 굳이 비밀번호를 입력하지 않아도 되고 보안을 크게 향상시킬 수 있습니다. 이 작업은 외부 컴퓨터에서 SSH 접속을 한 상태에서 진행하면 키 파일을 따로 추출하지 않아도 키 내용을 복사해서 Termius에 바로 붙여 넣을 수 있기 때문에 서버 내부가 아닌 SSH 터미널에서 진행하시는 것을 권장합니다. 먼저 터미널에서 아래의 명령어를 입력해서 개인키를 생성해 주세요.

ssh-keygen -t rsa -b 4096 -m PEM

 

  'Enter passphrase (empty for no passphrase)' 입력 창에서 아무것도 입력하지 않고 Enter를 누르면 비밀번호가 없는 키가 만들어지고, 비밀번호를 입력하면 비밀번호가 있는 키가 만들어집니다. 비밀번호를 만들어도 나중에 접속 프로그램에서 설정해 줄 때 한 번만 입력하면 되기 때문에, 저는 비밀번호가 있는 키를 만들었습니다. 비밀번호 입력까지 마치고 Enter를 누르면 아래와 같이 키가 생성된 것을 볼 수 있습니다.

 

 cat 명령어를 이용해서 id_rsa.pub 파일의 public key 내용이 출력되면 Ctrl+Shift+C를 눌러서 복사를 해줍니다. 그리고 echo "public key" 부분에 복사한 내용을 Ctrl+Shift+V를 이용해서 붙여 넣으면 authorized_keys 파일에 public key가 추가됩니다. 다시 cat 명령어를 통해 authorized_keys의 내용을 확인해 보면 붙여넣기한 공개 키가 잘 등록된 것을 볼 수 있습니다.

cat ~/.ssh/id_rsa.pub
echo "public key" >> ~/.ssh/authorized_keys

cat ~/.ssh/authorized_keys

 

  .ssh폴더 안에는 authorized_keys, id_rsa, id_rsa.pub 파일이 있습니다. id_rsa 파일은 private key 파일이고 id_rsa.pub 파일은 public key 파일입니다. 나중에 다른 컴퓨터에서 ssh를 이용해 접속하기 위해서는 private key인 id_rsa 파일이 필요하니 파일을 따로 복사해 두거나 아래와 같이 cat 명령어를 이용해서 파일의 내용을 복사해두어야 합니다. 

cat ~/.ssh/id_rsa

 

  등록을 마쳤으면 이제 ssh 설정에 들어가서 비밀번호로 로그인하는 기능을 막아야 합니다. 다시 에디터를 이용하여 sshd_config 파일의 설정을 변경해 줍니다.

sudo vim /etc/ssh/sshd_config

 

  설정 파일이 열렸으면 i를 눌러 insert 모드로 들어가서  #로 주석처리 되어있는 부분을 수정해 줍니다.

 

  먼저 PubkeyAuthentication을 Yes로 바꿔주고, AuthorizedKeysFile 부분이 주석처리가 되어있는 것을 #를 삭제해서 해제해 줍니다. 그다음 PasswordAuthentication을 no로 바꿔주면 비밀번호를 이용하여 로그인을 할 수 없게 되고 키가 있어야만 로그인이 가능해집니다. 수정을 다 했다면 esc를 누른 후에 :wq를 눌러 저장을 하고 에디터를 빠져나옵니다. 

 

  참고로 PermitRootLogin을 no로 설정하면 root 계정으로 로그인이 불가능해지고, prohibit-password로 설정하면 키를 가지고 있는 사용자의 root 계정 로그인만 허용합니다. 이미 키를 사용해서만 로그인이 되게 해 놨기 때문에 굳이 수정하지는 않았습니다.


3. Termius를 이용해서 SSH 접속하기

  SSH 접속 프로그램으로 putty와 같은 프로그램을 많이 사용하지만, 저는 UI가 예쁘고 한 번 설정해 두면 맥과 윈도우, 리눅스 모두에서 사용할 수 있는 Termius를 더 선호하는 편입니다. Termius를 이용해서 발급받은 키를 이용해 SSH 접속을 하는 과정은 다음과 같습니다.

 

  먼저 프로그램을 설치해서 로그인을 한 후에 NEW HOST를 눌러서 HOST 등록을 해줍니다. Address 부분에는 SSH 서버의 IP를 입력해 줍니다. SSH on <포트 번호> port에서 위에서 설정해 준 SSH의 포트 번호를 입력하고, Username을 입력해 줍니다.

 

  '+ Key, Certicicate, FIDO2' 버튼을 클릭해서 Key를 선택하고 label 이름을 입력한 후 엔터를 누르면 아래와 같이 New Key 화면으로 넘어갑니다. import 탭에서 Import from key file을 눌러서 서버에서 복사해 온 id_rsa 파일을 가져오거나, 복사한 id_rsa 파일의 private key 내용을 Paste 탭을 눌러서 Private key 부분에 붙여넣기를 해줍니다. 만약 앞에서 설정해 준 Passphrase가 있다면 입력해 줍니다.

 

  키 입력이 완료되면 다시 Host 설정창으로 돌아와서 Connect를 누르면 SSH 접속이 정상적으로 되는 것을 확인할 수 있습니다.

  미니 PC를 웹서버 용도로만 쓸 예정이라 큰 모니터에 연결을 할 필요는 없고 가끔 서버 상태 확인 용도로 작은 모니터가 필요할 것 같아 Hagibis IPS 미니 모니터를 구입했습니다.

 

  Aliexpress에서 28.70달러에 구입을 했고, 리뷰를 보니 대부분 해상도가 업그레이드된 2세대를 받았다고 해서 바로 구매 버튼을 눌렀습니다.

 

  상자를 보면 1세대인지 2세대인지 알 수 있다고 했는데, 막상 물건을 받아보니 몇 세대인지 적혀있지 않았습니다. 검색해 보니 SKU ID가 다르다고 하는데 뜯어서 직접 연결해서 해상도를 확인하기 전까지는 2세대인지 확인할 수 없었습니다. 다행히도 컴퓨터에 연결한 후에 해상도가 960x640으로 떠서 2세대인 것을 알았습니다. SKU ID가 609790이거나 아래 Q/HBSKJ에 2022가 써져 있으면 아마도 2세대인 것 같습니다.

 

  여하튼 AM02는 Type C 포트가 있어서 미니 모니터와 C to C 케이블을 이용해 바로 연결을 할 수 있습니다. 다른 C to C 케이블로 연결했을 때는 화면이 나오지 않았는데, 제품에 동봉된 케이블을 이용해서 연결하니 제대로 화면이 표시됐습니다. 저는 각도를 바꿔주는 젠더를 사용해서 깔끔하게 선 방향을 바꿔주었습니다. 만약 Type C 포트가 뒤에도 있었으면 더 좋았을 것 같다는 생각이 들기도 합니다.

 

  우분투에 Stacer를 설치해서 실시간으로 CPU와 Memory, Disk 모니터링을 해봤습니다. Stacer가 리소스를 많이 차지하지 않을 것 같았는데, 은근히 리소스를 많이 사용해서 프로세스를 종료하고 모니터를 꺼놨습니다. 미니 모니터는 책상 꾸미기 용으로 그냥 올려놓고, 가끔 미니 pc 상태를 확인할 때만 켜야 할 것 같습니다.

 

  AM02 모델에 기본으로 들어가 있는 Wicgtyp SSD가 어떤 제품인지 찾아봤습니다. FIREBAT의 제품뿐만 아니라 다른 제조사의 미니 PC에도 자주 탑재되는 SSD인 것 같습니다. NVMe 모델인 NV900-512 모델이 들어갔으면 좋았겠지만, 일반 M.2 SATA SSD 모델인 N900-512 모델이 들어가 있습니다.

 

  SSD 정보를 확인해 보면 Micron의 MLC 낸드와 실리콘모션의 SM2259XA 컨트롤러로 구성되어 있는 것을 볼 수 있습니다. 위 프로그램에서 나온 정보가 정확하지 않을 수도 있으니 참고용으로 봐주시길 바랍니다. (프로그램 링크)

 

  컨트롤러 제조사의 공식 문서를 보니 모델명 뒤에 XT가 붙은 모델은 DRAM-less 모델인 것 같네요.

 

  SSD 리뷰를 찾아보니 몇 달 정도 썼는데 갑자기 급사했다는 얘기가 있어서, 메인 SSD로 사용하기에는 불안했습니다. 그래서 SSD 인클로저를 구입해 외장 저장장치로 사용하기로 했습니다. 마침 Aliexpress 꽁돈대첩에서 미니 PC와 같은 회사의 SSD 인클로저가 세일 중이라 약 7,000원 정도에 NVMe와 SATA가 모두 지원되는 모델을 구입을 했습니다. 디자인이 Orico의 인클로저와 똑같은 걸로 봐서는 같은 공장에서 생산된 물건인 것 같습니다.

 

  구성품은 방열판과 서멀 패드, 고무 나사 2개, C to C 케이블입니다. C to USB 젠더가 없기 때문에 USB 포트에서 사용하기 위해서는 젠더를 따로 구입해야 합니다. 저는 일반 SATA SSD를 넣었기 때문에 굳이 써멀패드와 방열판은 설치하지 않았습니다. 참고로 연결 후 디스크 속성을 확인해 보면 모델명이 Realtek RTL9210B-CG로 표시됩니다.

 

  CristalDiskMark로 속도 측정을 해본 결과 컨트롤러 스펙 시트만큼 속도가 나오는 것을 볼 수 있습니다.

  최근 중국에서 제조된 일부 미니 PC에서 백도어가 발견됐다는 뉴스가 있었고, 기본으로 설치되어 있는 Wicgtyp SSD 역시 처음 들어보는 브랜드라 약간 불안해서 SSD를 WD NVMe SSD로 교체하고 윈도우를 재설치했습니다. 백신을 돌려봐서 문제가 없다면 그대로 써도 되지만, 저는 찝찝해서 그냥 새로 재설치를 했습니다. 그리고 드라이버를 백업해놓지 않으면 나중에 재설치하고 나서 드라이버를 다시 잡는 과정이 힘들기 때문에 꼭 드라이버를 백업하고 재설치하시길 바랍니다. 드라이버와 시디키를 백업하고 다시 복원하는 방법은 아래에서 자세히 설명하겠습니다.


1. 드라이버 백업하기

 

  드라이버를 백업하기 위해서 명령 프롬프트를 관리자 권한으로 실행합니다. 시작 버튼 옆에 있는 검색 창을 눌러서 명령 프롬프트를 실행해도 되고, Win+R키를 눌러 cmd를 입력한 후 Ctrl+Shift+Enter를 눌러 관리자 권한으로 실행해도 됩니다.

dism /online /export-driver /destination:<폴더 주소>

 

  명령 프롬프트가 실행되었다면 위와 같이 입력해 주세요. 폴더가 없으면 오류가 발생하기 때문에 미리 폴더를 만들어야 합니다. 드라이버 추출이 완료되었다면 추출한 폴더를 압축한 후에 usb 메모리에 따로 복사해 둡니다. 저의 경우에는 드라이버 용량이 약 800 MB 정도 나왔습니다.


2. 윈도우 시디키 백업하기

  윈도우 시디키를 백업하는 방법은 여러 가지가 있습니다. 저는 두 가지 방법을 썼었는데 두 방법 모두 시디키가 다르게 나와서 어떤 시디키가 맞을지 몰라 두 개 다 추출을 했습니다. 하지만 재설치를 해보니 자동으로 정품인증이 되어서 굳이 시디키를 백업할 필요는 없을 것 같지만 혹시 모르니 추출해 두시길 바랍니다.

 

  첫 번째로 명령 프롬프트를 이용해서 시디키를 추출하는 방법입니다.

wmic path SoftwareLicensingService get OA3XOriginalProductKey

 

  명령프롬프트에 위와 같이 입력하면 시디키가 나옵니다. 컴퓨터마다 표시가 안 되는 경우도 있다고 하는데, AM02에 설치된 Windows에서는 시디키가 표시됐었습니다.

 

  두 번째 방법은 레지스트리 편집기를 이용하는 방법입니다. Win+R키를 눌러서 regedit을 입력하고 확인을 누릅니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform

 

  위와 같은 경로로 들어가서 BackupProductKeyDefault 항목을 보시면 시디키를 확인할 수 있습니다. 두 방법이 시디키가 다르게 나오는 경우가 있으므로, 꼭 두 개 다 백업해 두시고 나중에 정품인증이 자동으로 안되면 추출한 시디키를 이용하여 인증을 시도해 보시길 바랍니다.


3. 윈도우 재설치 후 드라이버 복원

 

  윈도우 11 설치 usb를 만들고 윈도우를 재설치하고 나면 위와 같이 드라이버를 못 잡는 것을 볼 수 있습니다.

 

  백업한 드라이버를 재설치한 윈도우로 옮긴 후에, 명령 프롬프트를 관리자 권한으로 실행한 후에 아래와 같이 입력해 주세요.

pnputil.exe /add-driver <폴더 경로>\*.inf /subdirs /install

 

  저의 경우에는 폴더를 C:\drivers로 해서 C:\drivers\*.inf 이렇게 입력했습니다. 참고로 역슬래시(\)는 키보드 Backspace키 아래에 있는 키를 누르면 됩니다.

 

  드라이버 복원이 끝나고 재부팅을 하면 위와 같이 드라이버가 제대로 잡혀있는 것을 볼 수 있습니다.


4. 정품인증 확인

 

  설정 > 시스템 > 정품 인증 탭에 들어가 보면 따로 시디키를 입력하지 않아도 자동으로 정품인증이 되어있을 것입니다. 만약 정품인증이 안되어있다면 위에서 백업한 시디키를 입력해서 정품인증을 해주세요. 여기까지 진행했다면 윈도우 재설치는 끝입니다.


5. CMOS(BIOS 진입)

  제품 설명서에도 나와있지만, <F2>키를 누르면 CMOS에 진입할 수 있습니다. 일반적으로 <Del> 키나 <F12> 키를 눌러서 CMOS에 진입하는데, FIREBAT AM02 모델은 <F2> 키를 눌러야 CMOS에 진입할 수 있습니다.

 

  미니 PC라서 그런지 다양한 설정을 하지는 못하지만 WOL 기능이 있어 원격으로 PC를 켤 수 있습니다.

 

  저는 윈도우를 설치한 후에 우분투를 설치했는데, 윈도우 Bootloader가 먼저 인식되어서 설치한 우분투에 진입하지 못하는 문제가 있었습니다. CMOS에 들어가 보면 Boot > UEFI NVME Drive BBS Priorities 메뉴가 있는데 여기서 Boot Option 순서를 바꿔주니 우분투 Bootloader에서 우분투와 윈도우를 제대로 선택할 수 있었습니다. 

 

  1편 구입기에서 작성한 대로, 8월 Aliexpress 여름 세일 기간 중 13만 원 정도에 FIREBAT AM02 16GB/256GB 모델을 구입했습니다. 리뷰를 보니 검은색 상자가 오면 램을 교체할 수 있는 모델이고 하얀색 상자가 오면 온보드 모델인데, 8GB 모델은 하얀색 상자로 오고 16GB 모델은 검은색 상자로 온다고 해서 16GB 모델을 구입했고, 예상과 달리 물건을 받아보니 하얀색 상자가 왔습니다.

 

  같은 회사 제품 중 온보드 램이 달린 다른 모델이 급사 이슈가 있어서 반품할지 고민했었지만, 이 모델은 히트파이프 크기가 커서 발열 해소가 잘 된다는 얘기가 있었고, 램이 DDR4가 아닌 DDR5가 달려있어서 그냥 반품을 안 하고 쓰기로 했습니다.

 

  미니 PC라 본체는 성인 남성 손 크기 정도로 작았고, 전면에는 USB 3.0 포트 2개, Type C 포트 1개, Audio 포트 1개와 전원버튼이 달려있습니다.

 

  후면에는 RJ45 랜 포트 두 개와 HDMI, DP포트, USB 3.0 포트 2개가 달려있습니다. 미니 PC 대부분 랜 포트가 하나만 달려있는데, 이 모델은 두 개가 달려있어서 Link Aggregation 기능을 이용해 NAS 용도로 사용하기 좋을 것 같습니다. 후면에 Type C 포트가 하나 더 있었으면 하는 아쉬움도 있지만 포트 구성은 다른 모델들보다 충실한 편이라 만족스러웠습니다.

 

  구성품은 미니 PC 본체, 충전기, 설명서, HDMI 케이블, VESA 홀 전용 브래킷, 2.5인치 SATA 케이블입니다.

 

  36W DC 충전기가 들어가 있고, 구입할 때는 EU 규격이라고 적혀있었지만 실제로 받아보니 KR 규격이라 돼지코가 필요하지는 않았습니다.

 

  설명서에 적혀있는 스펙 시트입니다. SSD가 장착된 모델은 Windows 11 Home이 설치되어 있고, 온보드 램 모델은 DDR4가 아닌 LPDDR5가 탑재되어서 오는 것 같습니다.

 

  뒤판 모습입니다. 분해는 고무패킹 부분 나사 4개를 제거하기만 하면 돼서 간단한 편이었습니다.

 

  SSD는 Wicgtyp M.2 2280 SATA 512GB 모델이 달려있습니다.

 

  기존에 달려있던 SSD를 제거하고 6월 달에 Aliexpress에서 세일할 때 구입한 WD Black NVMe SSD SN770 500GB 모델로 교체했습니다.

 

  SSD를 제거하면 Intel AX101NGW 무선 랜카드가 보입니다. Wi-Fi 6와 Bluetooth 5.2를 지원한다고 합니다. 저가형 Realtek 모델이 들어가 있었으면 AX210로 교체할까 했는데 굳이 교체할 필요가 없을 것 같습니다.

 

  하판 뒷면에는 2.5인치 SSD나 HDD를 장착할 수 있게 되어있습니다.

 

  본체 크기만 한 히트파이프와 팬이 하나 달려있습니다. 사실 다른 미니 PC를 사용해 본 적이 없어서 다른 모델과 단순 비교는 할 수 없지만 실제로 사용해 보니 팬이 거의 돌아가지 않았고, 발열 해소가 잘 되는 편이었습니다. 하얀색 상자를 봤을 때는 걱정을 많이 했는데, 우려와 달리 온보드램이라는 것만 빼면 포트 구성이나 발열 관리면에서는 상당히 만족스러웠습니다.


 

  처음 부팅을 하니 FIREBAT 로고가 그려져 있는 배경화면이 반겨줍니다.

 

  스펙 시트에 적혀있는 그대로 N100, 램 16GB가 표시되고 있고, 제조업체 정보가 적혀있습니다.

 

  Windows 11 Home이 설치되어 있으며, 정품인증이 되어있습니다.

 

  CPU는 4 코어 4 스레드, 최대 클럭은 3.40 GHz입니다.

 

  램은 16GB이고, 온보드 램이라 폼 팩터가 Row of chips로 표시되고 있습니다. 램 클럭은 4000 MHz입니다.

 

 

  CPU-Z로 확인해 본 결과 램 제조사는 Micron이고, LPDDR5 4GB x 4개로 구성되어서 두 개의 Dual Channel로 작동하는 것 같습니다.

 

  대략적인 개봉기는 여기서 마치고 윈도우를 재설치하는 과정은 다음 글에서 이어서 작성하겠습니다.

  집에서 간단한 웹서버를 운영해보고 싶어서 미니 PC를 구입하기로 했습니다. 막상 구입하려고 하니 고려해야 할 것들이 많아서 저는 다음과 같은 사항들을 고려했습니다.

  1. CPU (N100 vs. 하이엔드 CPU)
    간단한 웹서버를 돌릴 거라 성능이 너무 좋을 필요는 없을 것 같았고, 24시간 켜둘 예정이라 소비 전력이 낮은 N100 모델을 선택했습니다.
  2. SSD (2.5인치 vs. M.2)
    나중에 NVMe SSD 모델로 업그레이드하려면 M.2 슬롯이 있는 것이 좋을 것 같아 M.2 슬롯이 달린 모델을 구입했습니다. 
  3. 램 (DDR4 vs. DDR5) and (온보드 vs. SO-DIMM)
    DDR5가 달린 모델도 있지만 간단한 작업 용도로 사용할 때 DDR4랑 차이가 크지 않을 것 같아서, 굳이 돈을 더 주고 DDR5를 가야 하나 싶어 DDR4가 달린 모델을 구입했습니다. 나중에 램을 32기가로 업그레이드할 예정이고 온보드 램이 달린 모델 중 급사 이슈가 있는 모델이 있어서, 온보드 램이 아닌 모델을 구입하고자 했습니다.

  위의 조건을 바탕으로 다음 모델들 중에서 구매하기로 했습니다.

  1. FIREBAT T8 PLUS : 쿨링이 별로인데 온보드 램이라 램 쪽에서 급사 이슈가 있는 것으로 알고 있습니다. 방열 작업을 따로 해줘야 한다고 해서 구매하기 약간 부담스러웠습니다.
  2. FIREBAT AK2 PLUS : 리뷰를 보니 램을 직접 교체할 수 있고, T8 PLUS 모델보다 쿨링이 개선된 모델인 것 같습니다. 
  3. FIREBAT AM02 : 가격이 약간 비싸지만 히트파이프가 커서 발열 해소가 뛰어나다고 하고, Type C, DP, 두 개의 RJ45 랜 포트 등 포트가 다양했습니다. 다만 검은색 상자로 포장된 제품은 램을 직접 교체할 수 있지만, 하얀색 상자는 온보드 램이라 뽑기 운이 존재하는 것이 단점이었습니다.
  4. Chatreey T8 : 평이 좋은 N100 미니 PC 중 하나입니다. 찾아보니 팬 소음이 약간 심하다고 합니다.
  5. Chatreey T9 : 리뷰를 보니 T8보다 발열이 개선된 것 같고, C타입 포트가 추가되었습니다.
  6. SOYO M2 PLUS : 가격이 가장 저렴한 대신 기본으로 2.5인치 SSD가 달려서 나오는 것 같습니다. 리뷰를 보니 M.2 슬롯이 존재하는 것 같고, DP 포트가 존재합니다.

  예산만 되면 가장 만듦새가 좋다는 Beelink 제품을 사는 게 가장 좋지만, 저는 N100이 달린 미니 PC에 많은 돈을 투자해야 하나 싶어서, 예산은 베어본일 경우 7~8만 원, SSD와 RAM 장착인 제품인 경우에는 13만 원 이하로 정하고 제품을 찾아봤습니다. FIREBAT AK2 PLUS, FIREBAT AM02, Chatreey T9, SOYO M2 PLUS 제품 중 하나를 사기로 결정했고, 마침 쿨링이 뛰어나고 포트가 다양한 FIREBAT AM02 16GB/512GB 모델을 13만 원에 구입할 수 있어서 구입을 하게 되었습니다.

 

  뽑기가 걱정되었지만 8GB 모델은 하얀색 상자로 오고, 16GB 모델은 검은색 상자로 온다는 리뷰를 보고 16GB 모델을 구입했고, 택배가 와서 상자를 뜯어보니 온보드 램이라는 하얀색 상자가 왔습니다.

 

  역시나 열어보니 온보드 램이었고 상품 설명에서는 DDR4였지만 실제로는 DDR5 램이 장착되어 있어서 반품을 안 하고 일단은 그냥 써보기로 했습니다. 자세한 개봉기는 다음 글에서 이어서 작성하겠습니다.

  pg 라이브러리를 사용해서 express에서 PostgreSQL을 사용하기 위해 공식 문서를 읽어보던 중, 매개변수화된 쿼리(Parameterized query) 항목을 보고 흥미가 생겼습니다. 우선 일반적인 쿼리문과는 다른 형태를 하고 있었고, SQL Injection 공격을 방지한다고 되어 있어서 일반적인 쿼리문보다 좋아 보였습니다. 하지만 공식 문서만 보고는 SQL Injection 공격이 무엇인지, 그리고 매개변수화된 쿼리가 어떻게 SQL Injection 공격에 더 안전한지 알 수가 없어서 관련 정보들을 찾아봤습니다.


1. SQL Injection 이란?

  SQL Injection은 가장 흔한 웹 해킹 기법 중 하나로써 웹 페이지 입력을 통해 SQL 문에 악성 코드를 삽입해서 데이터 베이스를 파괴할 수 있는 기법입니다. SQL Injection은 "1=1"이 항상 true 값을 반환한다는 것을 기반으로 합니다.

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

 

  "1=1"이 항상 true이기 때문에, UserId = 105와 상관없이 항상 true가 되어서 테이블의 모든 행을 반환합니다.

 

  직접 SQL 쿼리를 입력해 보면 이해하기 쉬울 것입니다. 만약 테이블에 user 이름과 비밀번호가 포함되어 있다면 해커는 105 OR 1=1을 삽입하여 데이터베이스의 모든 사용자 이름과 비밀번호에 액세스 할 수 있습니다.


2. 매개변수화된 쿼리(Parameterized query)

  매개변수화된 쿼리는 SQL Injection을 방지하는 효과적인 방법 중 하나입니다. 그 이유는 쿼리 구조와 데이터를 분리하기 때문입니다. 매개변수화된 쿼리의 구조는 다음과 같습니다.

const { pool } = require('../db');

const { UserId1, UserId2 } = req.query;

// 매개변수화된 쿼리 (Parameterized query)
const query = '
SELECT * FROM Users 
WHERE UserId = $1 OR UserId = $2
';
const values = [UserId1, UserId2];

const res = await pool.query(query, values);
console.log(res.rows);

 

  위 코드와 같이 UserId 값은 쿼리에서 직접 입력되는 것이 아니라, 별도의 값으로 전달이 됩니다. 따라서, 데이터는 쿼리의 일부로 해석되지 않습니다. 따라서, 일반적인 쿼리문을 쓰는 것보다 매개변수화된 쿼리를 사용하면 데이터베이스의 안전성을 높이고, SQL Injection 공격을 효과적으로 방어할 수 있습니다.


참고문헌

1. Parameterized Query - node-postgres 공식 문서 (링크)

2. SQL Injection - W3 Schools (링크)

+ Recent posts