macOS에서 Jupyter Notebook HTTP → HTTPS 전환하기
DuckDNS 무료 도메인 + Let's Encrypt로 어느 기기에서도 경고 없이 접속하는 법
- 왜 HTTPS가 필요한가
- 왜 이 방법을 선택했나
- 사전 준비
- DuckDNS 무료 도메인 발급
- Certbot 설치 및 인증서 발급 (DNS 방식)
- Jupyter 설정 파일 수정
- 접속 확인
- 인증서 갱신 방법 (90일마다)
1. 왜 HTTPS가 필요한가
Jupyter Notebook을 외부에서 접속할 수 있게 열어두면, HTTP 상태에서는 토큰, 코드, 데이터가 모두 평문으로 전송된다. 또 다른 기기에서 접속할 때 브라우저가 "안전하지 않음" 경고를 띄워 불편하다. HTTPS를 적용하면 이 두 가지 문제가 해결된다.
2. 왜 이 방법을 선택했나
HTTPS를 적용하는 방법은 여러 가지가 있지만, 각각 단점이 있다.
방법별 비교
학교에서 80번 포트를 차단하고 있어 일반적인 HTTP 인증 방식을 쓸 수 없었다.
그래서 포트가 필요 없는 DNS TXT 레코드 방식으로 인증하고, 무료 도메인은 DuckDNS를 사용했다.
3. 사전 준비
- macOS 환경
- 외부에서 접근 가능한 고정 공인 IP
- Jupyter Notebook 설치되어 있을 것
- Homebrew 설치 (
brew명령어 사용 가능해야 함)
apt가 없습니다. 패키지 설치는 모두 brew를 사용하세요.Homebrew가 없다면:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"4. DuckDNS 무료 도메인 발급
Let's Encrypt는 IP 주소가 아닌 도메인에만 인증서를 발급한다. DuckDNS에서 무료로 서브도메인을 만들 수 있다.
-
1DuckDNS 접속 및 로그인https://www.duckdns.org 에서 GitHub 또는 Google 계정으로 로그인한다.
-
2도메인 생성원하는 서브도메인 이름을 입력하고 add domain을 클릭한다.
-
3IP 연결생성된 도메인의 current ip란에 본인 공인 IP를 입력하고 update ip를 누른다.
-
4연결 확인터미널에서 아래 명령어로 도메인이 올바른 IP를 가리키는지 확인한다.
응답 IP가 본인 공인 IP와 일치하면 성공이다.ping <내 도메인>.duckdns.org
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:<포트 번호>/<노트북 경로>
이제 어떤 기기에서 접속해도 브라우저 경고 없이 HTTPS로 연결됩니다.
8. 인증서 갱신 방법 (90일마다)
Let's Encrypt 인증서는 90일마다 만료된다. 단, 도메인은 바꾸지 않아도 된다. 갱신이 필요한 건 인증서 파일뿐이다. 만료 30일 전부터 등록한 이메일로 알림이 온다.
발급 때와 동일한 과정을 반복하면 됩니다.
갱신 명령어
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일마다 인증서 갱신 (도메인은 유지)
같은 삽질을 하시는 분들에게 도움이 되길 바랍니다! 🎉
끝 — 궁금한 점은 댓글로 남겨주세요.