본문 바로가기
카테고리 없음

macOS에서 Jupyter Notebook HTTP → HTTPS 전환하기

by mummoo 2026. 4. 10.
macOS · Jupyter Notebook · HTTPS · Let's Encrypt

macOS에서 Jupyter Notebook HTTP → HTTPS 전환하기

DuckDNS 무료 도메인 + Let's Encrypt로 어느 기기에서도 경고 없이 접속하는 법

2026 · 약 20분 소요
목차
  1. 왜 HTTPS가 필요한가
  2. 왜 이 방법을 선택했나
  3. 사전 준비
  4. DuckDNS 무료 도메인 발급
  5. Certbot 설치 및 인증서 발급 (DNS 방식)
  6. Jupyter 설정 파일 수정
  7. 접속 확인
  8. 인증서 갱신 방법 (90일마다)

1. 왜 HTTPS가 필요한가

Jupyter Notebook을 외부에서 접속할 수 있게 열어두면, HTTP 상태에서는 토큰, 코드, 데이터가 모두 평문으로 전송된다. 또 다른 기기에서 접속할 때 브라우저가 "안전하지 않음" 경고를 띄워 불편하다. HTTPS를 적용하면 이 두 가지 문제가 해결된다.


2. 왜 이 방법을 선택했나

HTTPS를 적용하는 방법은 여러 가지가 있지만, 각각 단점이 있다.

방법별 비교

자체 서명 인증서 기기마다 인증서를 직접 등록해야 함. 다른 노트북에서 경고 계속 뜸
ngrok 무료 플랜은 접속할 때마다 URL이 바뀜
Cloudflare Tunnel 트래픽이 외부 서버를 경유. Jupyter 같은 환경엔 부담
유료 도메인 연간 비용 발생
DuckDNS + Let's Encrypt ✅ 무료, 경고 없음, 포트 개방 불필요

학교에서 80번 포트를 차단하고 있어 일반적인 HTTP 인증 방식을 쓸 수 없었다.

그래서 포트가 필요 없는 DNS TXT 레코드 방식으로 인증하고, 무료 도메인은 DuckDNS를 사용했다.

DuckDNS 무료 도메인 DNS TXT 인증 Let's Encrypt 인증서 Jupyter HTTPS 적용

3. 사전 준비

  • macOS 환경
  • 외부에서 접근 가능한 고정 공인 IP
  • Jupyter Notebook 설치되어 있을 것
  • Homebrew 설치 (brew 명령어 사용 가능해야 함)
💡 macOS는 apt가 없습니다. 패키지 설치는 모두 brew를 사용하세요.
Homebrew가 없다면: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

4. DuckDNS 무료 도메인 발급

Let's Encrypt는 IP 주소가 아닌 도메인에만 인증서를 발급한다. DuckDNS에서 무료로 서브도메인을 만들 수 있다.

  • 1
    DuckDNS 접속 및 로그인https://www.duckdns.org 에서 GitHub 또는 Google 계정으로 로그인한다.
  • 2
    도메인 생성원하는 서브도메인 이름을 입력하고 add domain을 클릭한다.
  • 3
    IP 연결생성된 도메인의 current ip란에 본인 공인 IP를 입력하고 update ip를 누른다.
  • 4
    연결 확인터미널에서 아래 명령어로 도메인이 올바른 IP를 가리키는지 확인한다.
    ping <내 도메인>.duckdns.org
    응답 IP가 본인 공인 IP와 일치하면 성공이다.

5. Certbot 설치 및 인증서 발급

Certbot 설치

brew install certbot

DNS 방식으로 인증서 발급 시작

sudo certbot certonly --manual \
  --preferred-challenges dns \
  -d <내 도메인>.duckdns.org \
  --email <본인 이메일> \
  --agree-tos \
  --no-eff-email

실행하면 아래와 같은 메시지가 뜬다. Enter를 누르기 전에 다음 단계를 먼저 수행해야 한다.

Please deploy a DNS TXT record under the name:
_acme-challenge.<내 도메인>.duckdns.org.

with the following value:
<인증 코드 값>

DuckDNS에 TXT 레코드 등록

DuckDNS 토큰은 로그인 후 페이지 상단에서 확인할 수 있다. 브라우저에서 아래 URL에 접속한다.

https://www.duckdns.org/update?domains=<내 도메인>&token=<DuckDNS 토큰>&txt=<인증 코드 값>

페이지에 OK가 뜨면 등록 성공이다.

전파 확인 후 Enter

아래 링크에서 TXT 레코드가 조회되는지 먼저 확인한다.

https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.<내 도메인>.duckdns.org

인증 코드 값이 보이면 터미널로 돌아가

Enter

를 누른다. 성공 시 아래 메시지가 출력된다.

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/<내 도메인>.duckdns.org/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/<내 도메인>.duckdns.org/privkey.pem

6. Jupyter 설정 파일 수정

Let's Encrypt 인증서 파일은 root 권한으로 보호되어 있어 Jupyter가 직접 읽지 못한다. 먼저 복사 후 권한을 부여한다.

인증서 파일 복사 및 권한 부여

mkdir -p ~/.jupyter/ssl

sudo cp /etc/letsencrypt/live/<내 도메인>.duckdns.org/fullchain.pem ~/.jupyter/ssl/fullchain.pem
sudo cp /etc/letsencrypt/live/<내 도메인>.duckdns.org/privkey.pem ~/.jupyter/ssl/privkey.pem
sudo chown <본인 사용자명> ~/.jupyter/ssl/fullchain.pem
sudo chown <본인 사용자명> ~/.jupyter/ssl/privkey.pem

설정 파일 생성 (없는 경우)

jupyter notebook --generate-config

설정 파일 수정

nano ~/.jupyter/jupyter_notebook_config.py

파일 맨 아래에 아래 내용을 추가하고 저장한다. (

Ctrl+O

Enter

Ctrl+X

)

c.NotebookApp.certfile = '/Users/<본인 사용자명>/.jupyter/ssl/fullchain.pem'
c.NotebookApp.keyfile  = '/Users/<본인 사용자명>/.jupyter/ssl/privkey.pem'
c.NotebookApp.ip       = '0.0.0.0'
c.NotebookApp.port     = <포트 번호>
c.NotebookApp.open_browser = False

7. 접속 확인

jupyter notebook

브라우저에서 아래 URL로 접속한다.

https://<내 도메인>.duckdns.org:<포트 번호>/<노트북 경로>
✅ 자물쇠 아이콘이 뜨고 인증서 발급자가 Let's Encrypt로 표시되면 성공입니다.
이제 어떤 기기에서 접속해도 브라우저 경고 없이 HTTPS로 연결됩니다.

8. 인증서 갱신 방법 (90일마다)

Let's Encrypt 인증서는 90일마다 만료된다. 단, 도메인은 바꾸지 않아도 된다. 갱신이 필요한 건 인증서 파일뿐이다. 만료 30일 전부터 등록한 이메일로 알림이 온다.

⚠️ DNS TXT 방식은 갱신 시마다 DuckDNS에 새 TXT 값을 다시 등록해야 합니다.
발급 때와 동일한 과정을 반복하면 됩니다.

갱신 명령어

sudo certbot renew --manual --preferred-challenges dns

갱신 후 인증서 파일을 다시 복사하고 Jupyter를 재시작한다.

sudo cp /etc/letsencrypt/live/<내 도메인>.duckdns.org/fullchain.pem ~/.jupyter/ssl/fullchain.pem
sudo cp /etc/letsencrypt/live/<내 도메인>.duckdns.org/privkey.pem ~/.jupyter/ssl/privkey.pem

jupyter notebook

📋 전체 흐름 요약

  • DuckDNS에서 무료 도메인 발급 → 공인 IP 연결
  • brew install certbot 으로 Certbot 설치
  • DNS TXT 방식으로 Let's Encrypt 인증서 발급
  • 인증서 파일을 ~/.jupyter/ssl/ 에 복사
  • Jupyter 설정 파일에 인증서 경로 등록
  • 90일마다 인증서 갱신 (도메인은 유지)

같은 삽질을 하시는 분들에게 도움이 되길 바랍니다! 🎉


끝 — 궁금한 점은 댓글로 남겨주세요.