
인터넷에 애플리케이션을 프록시하는 nginx 인스턴스가 있습니다. 응용 프로그램에 대한 인증을 시도하는 인터넷 요청에 대해 404를 반환하고 싶습니다. 응용 프로그램의 모든 공개 부분은 익명 액세스를 허용하기 때문입니다. 로컬 네트워크의 사용자만 인증할 수 있어야 합니다.
나는 단지 return 404를 사용하고 있기 때문에 간단한 if 블록을 사용할 수 있다고 생각하지만, 인증 헤더의 존재를 감지하는 데 가장 신뢰할 수 있는 if 조건이 무엇인지 확신할 수 없습니다.
if (auth headers exist) {
return 404;
}
이를 확인하기 위해 if 블록에 무엇을 넣을 수 있는지 제안하는 사람이 있나요?
답변1
일반적으로 if 문은 권장되지 않습니다. 그렇지 않으면 최소한 몇 가지 부작용을 알고 있어야 합니다. 읽다nginx 블로그의 "If is Evil"자세히 알아보기
귀하의 질문에 대답하려면 확인하려는 헤더가 "승인"이라고 가정하면 초기 가정은 이미 매우 정확했습니다.
if ($authorization) {
return 404;
}
그것은 이미 트릭을 수행해야 합니다. 또한 공용 서버 블록에만 이를 적용하려면 다음을 사용할 수 있습니다.ngx_http_access_module
답변2
일반적으로 요청을 인증하는 데 사용되는 Authorization 헤더가 요청에 있는지 확인할 수 있습니다. if 블록에서 $http_authorization 변수를 사용하여 이를 수행할 수 있습니다.
if ($http_authorization) {
return 404;
}
또는 애플리케이션에서 사용하는 특정 인증 헤더가 있는지 확인할 수 있습니다. 예를 들어 애플리케이션이 X-Auth-Token을 인증 헤더로 사용하는 경우 다음과 같이 확인할 수 있습니다.
if ($http_x_auth_token) {
return 404;
}
auth_basic 지시어로 보호되는 위치에 요청이 이루어진 경우에만 if 블록이 평가된다는 점을 기억하세요. 모든 요청에 인증 헤더가 있는지 확인하려면 대신 map 지시문을 사용할 수 있습니다.
map $http_authorization $block_public_auth {
default 0;
"~" 1;
}
server {
...
location / {
if ($block_public_auth) {
return 404;
}
...
}
}
위의 경우 위치에 관계없이 Authorization 헤더가 있는 모든 요청을 차단합니다.