Node.js

[node.js] HTTP Digest 인증

behonestar 2015. 5. 9. 11:14

Basic 인증과 Digest 인증

Basic 인증에서는 클라이언트의 사용자 이름과 암호가 Base64로 인코딩된 문자열을 보낸다. Base64는 암호화 형식이 아니므로 사용자 이름 및 암호를 일반 텍스트로 보내는 것과 동일하다고 간주해야 한다. 리소스를 보호해야 하는 경우 Basic 인증이 아닌 다른 인증 방법을 사용하는 것이 좋다.


Digest 인증은 Basic 인증을 대체하기 위한 인증 방법이다. 서버에서는 nonce라는 난수 데이터 문자열을 클라이언트에 보낸다. 클라이언트에서는 추가 정보 중에서 사용자 이름, 암호 및 nonce를 포함하는 해시를 사용하여 응답한다. 이러한 교환 과정에서 발생하는 복잡성 및 데이터 해시 때문에 Digest 인증 방법을 사용하는 사용자의 자격 증명을 도용하거나 재사용하기가 어렵다.

  • 비밀번호를 네트워크를 통해 평문으로 전송하지 않음
  • 인증 체결을 가로채서 재현하지 못함
  • 구현 방법에 따라 메시지 내용 위조 방지 가능

node.js에서 Digest 인증을 요구하는 예제 코드를 작성해보자.

1. http-auth 모듈 설치

$ npm install http-auth


2. htdigest 유틸리티 설치

$ npm install -g htdigest


3. 패스워드 파일 생성

-c : 새로운 패스워드 파일을 만든다.

htpasswd : 패스워드 파일명.

user area : realm. 로그인 시 출력되는 메시지. 주로 사용자가 접속하고자 하는 영역의 이름.

superstar : username. 파일에 username이 없다면 추가, 있다면 암호를 수정.

명령행을 실행하면 생성할 비밀번호를 물어본다.

$ htdigest -c htpasswd "user area" superstar

New password: _

Re-type new password: _

Adding password for user superstar in realm user area.


4. htpasswd 파일 확인

superstar 사용자에 대한 인증 영역, 암호화된 비밀번호를 포함한다.

superstar:user area:0bb93a8e43539624c0a48b8bb7ede263


5. 서버 생성

var http = require("http");
var auth = require("http-auth");

var digest = auth.digest({
  realm: "user area",
  file: __dirname + "/htpasswd"
});

var server = http.createServer(digest, function(request, response) {
  var header = request.headers['authorization']||''
     ,regex  = /username=\"(.*?)\"/;
     ,username = regex.exec(header)[1];
 
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello " + username);
  response.end();
});

server.listen(80);
console.log("Server is listening");


6. 동작 확인



7. HTTP Header 분석

서버에 console.log(header)를 추가하면 아래의 header 정보를 출력할 수 있다.

Digest username="superstar", realm="user area", nonce="3dcc1ed8396a399f22b9cd01416ee58f", uri="/", algorithm=MD5, response="4216a86acfad775efe87c2c360ac5f01", qop=auth, nc=00000001, cnonce="7f96c0568a8de109"

  1. username : 사용자 인증 대화상자에 입력한 사용자 이름.
  2. realm : 로그인 시 출력되는 메시지. 주로 사용자가 접속하고자 하는 영역의 이름.
  3. nonce : 서버에서 생성한 유일한 값.
  4. qop : quality of protection. auth, auth-int, token 중 하나의 값.
  5. algorithm : 암호화 알고리즘. digest 인증의 경우 MD5를 사용.
  6. uri : 사용자 인증을 요구하는 현재 페이지의 주소.
  7. nc : nonce-count. nonce값을 호출 횟수.
  8. cnonce : 해커에 의한 평문 공격을 막고자 웹브라우저에서 생성한 값.
  9. response : 사용자 인증을 위해 위 항목들을 조합하여 최종적으로 생성한 값.

참고자료

  1. HTTP 다이제스트 인증
  2. 제타위키, HTTP 다이제스트 인증
  3. 제타위키, MD5
  4. 제타위키, Nonce
  5. http://http-auth.info/
  6. http://www.activemedia.co.kr/lesson.php?id=80
  7. https://github.com/gevorg/htdigest
  8. http://www.sitepoint.com/http-authentication-in-node-js/


'Node.js' 카테고리의 다른 글

[node.js] AWS EC2에 node.js 설치  (0) 2015.05.14
[node.js] Token 기반 인증  (0) 2015.05.09
[node.js] 이벤트  (0) 2015.05.05
[node.js] HTTP 동시 접속 성능 테스트  (0) 2015.05.05
[node.js] 특징  (0) 2015.05.05