nginx_proxy_manager_loginpage

nginx_proxy_manager_loginpage

NPM(Nginx Proxy Manager)로 특정URL에만 인증 넣기

컴퓨터, 소프트웨어 2026년 8월 5일
nginx_proxy_manager_loginpage

개요

NPM(Nginx Proxy Manager)이란?

Self-hosted로 여러 사이트를 관리하는 소규모 기업, 단체, 개인이 도메인과 인증서 연결을 쉽게 할 수 있도록 돕는 리버스 프록시 관리앱입니다. Nginx Proxy Manager는 이름 그대로 내부에 NginX를 사용하며 오픈소스입니다. 이 글에서는 Nginx Proxy Manager를 편의상 NPM으로 표기합니다.

원래 NPM이라는 단축어는 Node Package Manager를 뜻하는 경우가 더 많습니다. 아무래도 node.js사용자가 더 많으니까요. Node Package Manager는 본문과는 아무런 관련이 없습니다.

NPM의 인증 도구

NPM은 전문적인 인증 도구가 포함되어 있지는 않습니다. 간단한 Basic Auth만 제공합니다. 회원관리, 멋있는 UI, 고급 기능이 포함된 전문적인 인증 도구가 필요한 경우에는 Authentik, Authelia, Pocketbase 등을 NPM과 함께 이용하는 것을 추천합니다.

이 글에서 다루는 팁

NPM의 기본 인증도구를 이용해 기본URL(https://my.bonik.net)과 특정URL(https://my.bonik.net/test)에 각각 인증을 넣는 방법을 다룹니다.

NPM에서 Basic Auth이용하는 방법

basic_auth_on_browser

Basic Auth는 브라우저에서 간단한 팝업을 띄워 id, pw를 입력받아 인증하는 방식입니다. 다른 앱이나 터미널에서 curl, request등으로 접근할 때는 url에 id, pw를 넣어서 인증할 수도 있고, id, pw를 base64로 인코딩해서 헤더에 넣는 방법으로 인증할 수도 있습니다. 다음은 NPM의 자체기능만을 이용해 Basic Auth방식의 인증을 넣는 방법입니다.

1. Access Lists에서 원하는 접근 리스트 및 계정 만들기

Add Access List를 누르고 원하는 리스트를 만듭니다. 각 리스트별로 여러개의 계정을 만들 수 있습니다. 여기서 리스트는 권한 분리를 위한 거라고 생각하면 됩니다. A사이트에 접근 가능한 그룹a, B사이트에 접근가능한 그룹b과 같이 분리해서 관리할 수 있습니다.

NPM으로 접근 리스트 만들기

테스트용으로 그룹a라는 걸 만들었습니다. Satisfy Any는 여러 인증 조건 중 하나만 만족해도 통과하도록 하는 것입니다. ip기반 인증과 basic auth방식의 인증이 있을 경우 둘 중 하나만 만족해도 통과됩니다. 저는 편의상 활성화했습니다. Pass Auth to Host는 인증이 통과했다는 것을 목적지에 알리는 용도입니다. 목적지의 사이트 상태에 따라 켜야할 수도 있고, 꺼야할 수도 있습니다. 예시에서는 편의상 켜 두었습니다.

NPM으로 접근 리스트에 유저 생성

다음으로 Authorization을 클릭하고 원하는 유저를 추가하면 됩니다. basic auth는 간편한 인증도구이기 때문에 공백이나 특수문자, 한글을 넣지 않는 것을 추천합니다.

새로 추가된 Acess list

2. 특정 도메인(기본 URL)에 인증 넣기

NPM-기본URL에 인증을 추가

https://my.bonik.net/test 라는 URL이 있을 때 https가 프로토콜이 되고, path인 /test를 제외한 my.bonik.net이 기본URL이 됩니다. 기본 URL에 넣는 것은 아주 쉽습니다. 기존 프록시 설정에서 Access List만 Publicly Accessible에서 그룹a(예시에서 만든 그룹명)로 변경하면 됩니다.

3. 특정 도메인(path 포함)에 인증넣기

기본URL및 모든 path에 같은 인증을 적용하려면 위의 방법만으로 끝납니다.

하지만 때로는 특정 URL에만 인증을 걸고 싶을 때가 있습니다. 예를 들어, 제가 자주 사용하는 조플린(joplin)에는 노트 발행 기능이 있습니다. 노트를 발행하면 특정 URL이 할당되서 해당 URL로 누구나 노트를 볼 수 있습니다. 만약 이 노트를 계정이 있는 사람만 보게 하고 싶을 때 다음과 같이 할 수 있습니다.

조플린에서 작성하고 발행한 노트

테스트용으로 조플린에서 노트 하나를 작성하고 발행했습니다. 노트 URL은 다음과 같습니다.

https://note.bonik.net/shares/jQfZ2YkInkjYLr4vma8rrP

이제 이 노트에만 인증을 걸 것입니다. 기본 URL로 인증을 걸면 안됩니다. 기존 note.bonik.net에는 joplin server 자체의 인증이 있어서 이를 망가뜨리면 안됩니다. 게다가 NPM Advanced에 직접 nginx 코드를 넣었을 때도 Access List 설정은 무시될 수 있습니다.(인증 부분도 nginx코드로 넣어야 작동함)

우선 인증에 이용할 id와 pw를 만듭니다. myid, mypw라고 가정합니다. 리눅스에서 다음과 같은 명령어를 입력해 base64로 인코딩합니다.(basic64 인코딩을 제공하는 웹사이트를 이용해도 됩니다.)

echo -n "myid:mypw" | base64

결과는 다음과 같습니다. 참고로 base64는 인코딩이지 암호화가 아닙니다.

bXlpZDpteXB3
NPM-custom locations 추가

이제 새 프록시를 만들지 않고 기존 프록시(note.bonik.net)에 Custom locations를 하나 추가합니다. location에 다음과 같이 입력합니다.

/shares/jQfZ2YkInkjYLr4vma8rrP

IP, Port는 기존 프록시와 같게 넣어줍니다. (어차피 무시됨) location 옆에 있는 기어 아이콘을 누르면 nginx 코드 입력 창이 열립니다. 코드 입력 창에 다음과 같이 넣어줍니다.

# 브라우저에 인증 팝업을 요청하는 헤더와 401 응답 처리
location /shares/jQfZ2YkInkjYLr4vma8rrP {
    if ($http_authorization != "Basic bXlpZDpteXB3") {
        set $auth_header 'Basic realm="Restricted Area"';
        add_header WWW-Authenticate $auth_header always;
        return 401;
    }
    proxy_pass http://172.17.0.1:22300/shares/jQfZ2YkInkjYLr4vma8rrP;
}

이제 note.bonik.net/shares/jQfZ2YkInkjYLr4vma8rrP URL에 접근시 myid, mypw라는 암호를 입력해야만 노트 내용을 볼 수 있습니다.

4. 계정이 여러 개일 때

인증에 사용되는 계정이 하나라면 위와 같이 하면 되지만 사용하는 계정이 여러 개일 때도 있습니다. 이쯤에서 더 고급 인증 기능이 필요하다면 다른 앱으로 넘어가는 것도 괜찮습니다. 저는 개인적으로 pocketbase를 사용하고 있습니다. (약간의 js, html, css 코드를 작성해야 합니다.)

여러 계정을 이용해서 NPM Basic Auth기능을 사용할 때는 인증이 보관되는 파일로 관리합니다. 이 파일은 apache util로 관리합니다. 따라서 NPM인증에 사용되는 여러 계정을 관리하려면 아파치 유틸이 있어야 합니다. 다음 명령어로 설치할 수 있습니다.

sudo apt install apache2-utils -y

또한 이 유틸을 이용해서 만든 계정파일(이름은 자유롭게 작성가능, 저의 경우는 npm_auth)을 NPM내부에서 읽을 수 있어야 합니다. 도커를 사용하는 경우 도커 볼륨으로 제어 가능합니다.

저의 경우는 NPM을 도커로 구동하고 다음 경로에 있습니다.

/home/docker/nginx-proxy-manager

/home/docker/nginx-proxy-manager/data폴더는 NPM도커 내부에서 /data폴더가 됩니다. 따라서, npm_auth라는 인증 파일을 /home/docker/nginx-proxy-manager/data/npm_auth에 저장하면 도커 내부의 /data/npm_auth에서 읽을 수 있습니다.

apache util을 이용한 계정만들기

htpasswd -b -c /home/docker/nginx-proxy-manager/data/npm_auth myid mypw

이제, 기존의 base64로 표시했던 계정 정보를 파일로 변경해 주면 됩니다. 이 방식에서는 401리턴을 수동으로 작성하지 않아도 자동으로 처리합니다.

location /shares/jQfZ2YkInkjYLr4vma8rrP {
    auth_basic "Restricted Area";
    auth_basic_user_file /data/npm_auth;
    proxy_pass http://172.17.0.1:22300/shares/jQfZ2YkInkjYLr4vma8rrP;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

태그

BoniK

협업, 의뢰, 레슨 등 문의 : mail@bonik.me | https://open.kakao.com/me/bonik