Apache | 액세스(Access) 권한 | 다이제스트 인증 설정 (htdigest)

기본(basic) 인증은 거의 모든 브라우저에서 사용할 수 있지만, 사용자명과 비밀번호 정보를 서버에 전송할 때 일반(Plain) 텍스트로 전송되므로 만약 통신 내용을 중간에 가로채면 사용자명과 비밀번호를 노출이 되어 버린다.

그래서 브라우저와 서버간에 이루어지는 통신에서 흐르는 정보를 MD5로 암호화하고 통신하는 방식이 다이제스트 인증이다.

설정 방법은 기본 인증의 경우와 비슷하다. 순서대로 살펴 보도록 하자.

비밀번호 파일 생성

먼저 비밀번호 파일을 작성한다. 기본 인증의 경우에는 Apache에서 제공되는 “htpasswd.exe"를 사용했지만, 다이제스트 인증의 경우에는 “htdigest.exe"를 사용한다. 이 파일이 놓여있는 위치는 “htpasswd"와 동일하게 “(Apache 설치 디렉터리)/Apache24/bin"에 있다.

실행시의 형식은 다음과 같다.

htdigest 옵션 비밀번호-파일 영역명 사용자명

생성한 비밀번호 파일을 지정하고 추가하는 사용자명을 지정한다. 비밀번호 파일을 새로 만들려면 옵션 “-c"를 지정한다. 기존의 비밀번호 파일에 사용자를 추가하는 경우에는 옵션에 아무것도 지정하지 않는다.

기본 인증의 경우와 다른 점은 “영역명"을 맞게 지정한다. 이 영역명은 “AuthName"로 지정하는 영역명과 동일해야 한다.

htdigest -c "C:/apache/passwd/digestpass" "Digest Auth" devkuma

위에서는 비밀번호 파일은 “C:/apache/passwd/digestpass"으로 하고, 영역명은 “Digest Auth"으로 하였으며, 사용자명은 “devkuma"로 지정하여 새 암호 파일을 만들고 있다. 생성할 때는 설정 비밀번호를 두 번 입력해야 하다.

C:\apache\Apache24\bin>htdigest -c "C:/apache/passwd/digestpass" "Digest Auth" devkuma
Adding password for devkuma in realm Digest Auth.
New password: ****
Re-type new password: ****

C:\apache\Apache24\bin>

생성된 비밀번호 파일은 텍스트 파일이므로 텍스트 편집기으로 열어 볼 수 있다.

devkuma:Digest Auth:511a7e57972fad36f7687cf36cd57d6e

“사용자명:영역명:비밀번호"의 형식으로 사용자 1명에 1줄로 작성된다.

httpd.conf 설정

“httpd.conf” 설정은 기본 인증의 경우와 거의 동일하다.

“AuthType"에는 “Basic” 대신에 “Digest"을 지정하고, “AuthName"는 비밀번호 파일을 만들 때 지정한 것과 동일한 영역명을 지정한다. 비밀번호 파일의 지정은 이전 버전에서는 “AuthDigestFile"를 사용한 것 같은데 Apache2.2 이후부턴"AuthUserFile “이다.

<Directory "${SRVROOT}/htdocs/admin">
    AuthType Digest
    AuthName "Digest Auth"
    AuthUserFile "C:/apache/passwd/digestpass"
    Require valid-user
</Directory>

모듈 추가

다이제스트 인증을 사용하는 경우에는 “auth_digest_module"모듈을 로드해야 한다. 디폴트로는 로드하지 않도록 되어있다. “httpd.conf"파일에서 “auth_digest_module"로 검색 해보세요. 71 번째 줄 부근에 설명이 있다.

LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so <--------- 디폴트로 로드하지 않도록 주석으로 되어 있다.
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule authn_anon_module modules/mod_authn_anon.so

“auth_digest_module"에 대한 “LoadModule"의 앞에 “#“이 작성 되어있다면 “#“을 제거한다. 이것으로 다음부터는 “auth_digest_module” 모듈을 로딩이 될 것이다.

LoadModule asis_module modules / mod_asis.so
LoadModule auth_basic_module modules / mod_auth_basic.so
LoadModule auth_digest_module modules / mod_auth_digest.so  <--------- '#'를 제거하여 주석을 풀었다.
#LoadModule authn_anon_module modules / mod_authn_anon.so
#LoadModule authn_dbm_module modules / mod_authn_dbm.so

다이제스트 인증을 시도

그럼 문서 루트 아래의 “admin” 디렉터리에서 다이제스트 인증을 설정한다. 사용되는 비밀번호 파일은 앞에서 작성한 것을 그대로 사용한다.

<Directory "${SRVROOT}/htdocs/admin">
    AuthType Digest
    AuthName "Digest Auth"
    AuthUserFile "C:/apache/passwd/digestpass"
    Require valid-user
</Directory>

그러면 브라우저에서 “http://localhost/admin/admin.html"에 액세스하면 다음과 같이 인증 대화 상자가 표시된다.

크롬에서 접속한 경우

다이제스트 인증

Microsoft Edge에서 접속한 경우

다이제스트 인증

인증 대화 화면의 기본 인증의 경우와는 약간 차이가 있지만 기본적으로 동일하다. 올바른 사용자명과 비밀번호를 입력하고 인증을 통과하면 해당 페이지가 표시된다.

다이제스트 인증

인증 대화 화면에서 “취소"버튼을 클릭하면 다음과 같은 오류 표시가 행해지고 요청은 종료된다.

다이제스트 인증

덧붙여서 비밀번호 파일을 만들 때 사용자에게 설정한 영역명과 “AuthName"에서 설정한 영역명이 다른 경우에는 사용자명과 비밀번호가 일치하여도도 인증은 되지 않는다.




최종 수정 : 2019-12-10