하지만 Apache 인증의 가장 주된 골자는 Authenticate와 Authorization이다. Apache 2.2에서 authn module은 Authenticate를 담당하는 모듈이고, authz module은 Authorization을 담당하는 모듈이며, authnz 모듈은 양쪽 모두 수행하는 모듈이다. 자 이렇게 설명하면 간단한데, 조금 더 자세히 설명해보자.
유저 elenoa가 특정 WEB Site에 접근한다.
만일 요청된 URI가 인증을 필요로 한다면, 해당 WEB Site는 유저에게 ID와 Password를 요구하고,
유저는 이를 제공한다.
WEB Site는 이것을 분석하여 해당 유저가 적법한 유저인지를 판명하고, 만일 유저가 적법하다면,
그 유저가 요청한 URI가 해당 유저에게 제공되어도 좋은지를 판단한다.
만일 해당 유저가 해당 URI에 요청한 것을 수행할 수 있는 권한을 가지고 있다면,
해당 URI에 유저가 요청한 동작을 수행한다.
Authenticate는 4번을 판단하는 모듈이고, Authorization는 6번을 판단하는 모듈이라고 생각하면 된다. Apache 2.2에서의 세분화는 기존에 Apache가 제공하고 있던 기능에 맞춰서 module 라인업을 리뉴얼 한 것이고, (사용해 보지는 않았지만!) 적절했다고 본다. (필요한 부분만 가져다 쓸 수 있도록 되어 있다)
Authenticate 과정은 mod_auth_basic 모듈에서 부터 시작된다. (mod_auth_digest 모듈도 있지만 여기서는 설명하지 않는다.) mod_auth_basic 모듈에서는 check_user_id 단계에서 hook을 통해 (ap_hook_check_user_id 를 통해 등록됨) authenticate_basic_user 함수가 호출된다.
이어서 authenticate_basic_user 함수는 get_basic_auth 라는 함수에 의해 HTTP의 Authorization 헤더로 입력된 스트링을 parse 하여 user와 password 부분을 분리하고, 등록된 authn 모듈을 호출하게 된다.
authn 모듈이 mod_auth_basic 모듈에서 검색되는 과정에서는 provider라는 개념이 사용되는데, authn 모듈들은 자신의 provider 구조체를 ap_register_provider 함수를 통해 AUTHN_PROVIDER_GROUP 에 소속된 provider로써 등록시키고,
mod_auth_basic 모듈은 httpd.conf 상에서 AuthBasicProvider 지시어의 인자로 받아들이는 add_authn_provider 함수에서 지시된 authn 모듈의 provider 구조체를 읽어들여 (ap_lookup_provider 함수가 사용된다) 등록한다.
authn 모듈에서 사용되는 provider 구조체는 mod_auth.h에 정의되어 있는데, 구조는 아래와 같다.
mod_auth.h:(line 51 - 63) typedef struct { /* Given a username and password, expected to return AUTH_GRANTED * if we can validate this user/password combination. * (그러니까 이것은 mod_auth_basic 모듈에서 사용하고,) */ authn_status (*check_password)(request_rec *r, const char *user, const char *password);
/* Given a user and realm, expected to return AUTH_USER_FOUND if we * can find a md5 hash of 'user:realm:password' * (그러니까 이것은 mod_auth_digest 모듈에서 사용한다.) */ authn_status (*get_realm_hash)(request_rec *r, const char *user, const char *realm, char **rethash); } authn_provider;
다시 돌아와서, 정리하자면, mod_auth_basic 모듈의 authenticate_basic_user 함수는 get_basic_auth 함수를 통해 인증 스트링을 parse 하고, authn 모듈에서 provider에 등록된 check_password 함수를 호출하는 것이 전부이다.
Authenticate에 비하여 Authorization은 더욱 더 간단하다. 그 이유는 Authenticate는 mod_auth_basic이나 mod_auth_digest 모듈이 mod_authn_* 모듈에서 등록한 함수를 호출해야 하는 과정이 필요하고, 사용할 authn 모듈을 mod_auth_* 모듈에 등록하는 과정이 필요한 반면, Authorization은 authz 모듈 단독으로 수행되기 때문이다.
Authorization은 auth_checker 단게에서 hook을 통해 (ap_hook_auth_checker 를 통해 등록됨) 각각 authz 모듈의 hook function들이 호출된다.
여기서 유일하게 알아둬야 할 부분은 hook function의 유일한 인자인 request_rec 구조체의 user 항목에 사용자 ID가 넘어온다는 것이고, 나머지는 각각 모듈의 구현에 따라 다르다.
더 자세한 설명은 생략하기로 한다. (사실 Apache 2.0의 내용을 기본으로 2.2에 대해 설명하자니 힘들다!)