목차
개요
한 사이트에 여러 가지 CMS를 사용할 수도 있지만, 나는 보통 하나의 CMS만을 사용하면서 CMS 자체적으로 해결할 수 없는 부분은 따로 html을 만드는 편이다.
하지만 이렇게 추가적인 html 파일을 웹에서 접근이 가능한 경로에 업로드하면 문제가 생긴다.
CMS에서의 로그인 상태로 html 파일에 대한 접근 권한을 설정할 수 없기 때문에 모든 사람이 해당 html 파일에 접근할 수 있는 것이다.
이 문제를 해결하기 위해 StudyForUs에 질문을 올렸고, YGL님께서 알려주신 node의 내장 기능 fs 모듈을 통해 로컬 파일을 include 하는 방식과 OAUTH2님이 알려주신 http auth request 모듈을 통한 인증 방식 중 후자를 먼저 시도해봤다.
인증 방식
http auth request 모듈의 인증 방식은 간단하다.
우리가 보호하고자 하는 경로와 별도로 인증을 진행할 경로를 만들어준다.
인증 경로로 접속했을 때 응답 코드가 2xx일 경우 보호하고자 하는 경로에 접근할 수 있고, 그 외의 응답 코드가 발생하면 접근을 차단한다.
내 경우에는 goaccess에서 생성되는 로그 분석 파일을 보호하고 싶고, NodeBB의 관리자 메뉴를 인증 경로로 설정했다.
관리자 권한이 없는 사람이 관리자 메뉴에 접근할 경우 redirect(3xx)가 발생하고, 권한이 있을 경우 정상적으로(2xx) 접속된다.
이를 통해 관리자 권한이 있는 사람만 로그 분석 창에 접근할 수 있게 /etc/nginx/sites-available 폴더의 서버 파일에 auth request와 관련된 내용을 추가해준다.
내 경우에는 default 파일을 PLANIT에 사용하고 있고, 항상 https와 non-www 도메인으로 연결이 되게 해두었다.
설정 방법
우선 https non-www 서버 블록에 goaccess 분석 파일로의 경로를 지정해준다.
[도메인.com/접속경로] 경로로 접속하면 [도메인.com/auth] 경로에서 인증을 진행하고, 인증에 성공하면 서버의 실제 분석 파일 디렉토리로 연결이 되는 것이다.
location ^~ /접속경로 {
auth_request /auth;
alias /분석파일디렉토리;
}
그 뒤 바로 아래에 auth 경로에 대한 설정을 해주면 된다.
[도메인.com/auth] 경로가 [https://도메인.com/관리자]로 연결되기 때문에 관리자 계정으로 접속했다면 인증이 정상적으로 진행된다.
location = /auth {
internal;
proxy_pass https://도메인.com/관리자;
}
설정한 뒤에는 nginx 상태를 확인하고 재시작한다.
$ sudo nginx -t
$ sudo service nginx restart
재시작 후에 확인해보니 관리자 계정 로그인 상태에서는 해당 html이 정상적으로 출력되었고, 비회원인 상태로 접근하면 500 Internal Server Error가 출력됐다.