Julie의 Tech 블로그

HTTP - (7) 다이제스트 인증 본문

Tech

HTTP - (7) 다이제스트 인증

Julie's tech 2021. 6. 14. 00:02
728x90

이전 글에서 살펴본 기본 인증은 안전하다고 보기 어렵다.

사용자의 정보를 평문으로 담아 보내기 때문에 SSL과 결합하여 보내는 것이 가장 안전하게 이용하는 유일한 방법이다.

다이제스트 인증은 이러한 기본 인증을 보안적인 측면에서 좀 더 강화하기 위해 제기되었다.

다이제스트 인증은 아래와 같은 특징을 갖는다.

* 비밀번호를 평문으로 전송하지 않는다

* 메시지 내용 위조를 막는다

* 그 외 악의적인 개입이나 공격들을 막도록 설계되었다.

그렇다고 해서 다이제스트 인증이 가장 안전한 방법이라는 것은 아니다. 하지만 기본 인증보다는 안전하다고 할 수 있다.

비밀번호를 평문으로 보내지 않는다고 했는데, 비밀번호 대신 이를 섞은 '지문(fingerprint)'혹은 '요약(digest)'을 보낸다.

클라이언트와 서버 양쪽 다 비밀번호를 알고 있으므로, 서버는 클라이언트에서 보내온 지문/요약이 올바른지 알 수 있다.

서버는 클라이언트에서 보내온 비밀번호 요약 정보와 내부에 저장되어있는 비밀번호의 요약 정보가 동일한지 확인한다.

요약은 단방향으로 정보를 압축하는 것인데, 가장 대표적인 함수는 MD5라고 불린다.

MD5는 본래 문자열의 길이와 상관없이 128 비트로 요약하여 반환한다.

이외에도 단방향 해시함수 혹은 지문함수(fingerprint funciton)이 사용될 수 있고, 암호 체크섬이라고 불린다.

이 때 이 요약값 자체를 가로채어 서버로 보내게 되면, 악의적인 유저도 로그인할 수 있게 된다.

요약값 자체가 비밀번호와 동일하게 되기 때문이다. 이 때는 난수값을 함께 전송하기도 한다.

이러한 방법을 통해 재전송을 막을 수 있기 때문이다. 비밀번호 요약값이 특정 난스 값에 대해서만 유효하게 되기 때문이다.

메시지 전송 과정을 한 번 살펴보면 아래와 같다.

1) 서버가 난수 값을 계산하여 WWW-Authenticate 인증 요구 메시지를 담아 보내는데, 이 때 서버가 지원하는 알고리즘 목록을 함께 보낸다.

2) 클라이언트는 알고리즘 중 하나를 선택하여 응답 요약값을 만들고, (서버를 인증하길 원할 경우) 클라이언트 난수를 생성하여 전송한다.

3) 서버는 클라이언트가 보내온 요약값을 비교하여 검증하고, 난수를 생성하여 Authentication-Info 정보를 보낸다.

요약값 계산하는 과정에 대해 좀 더 살펴보자.

우선 정보를 두 가지로 나눈다 : 보안 정보를 담고 있는 데이터 (A1), 그 외 일반 정보를 담고 있는 데이터 (A2)

이 정보를 요약하는 함수는 두 가지가 있다. 단방향 해시함수(H)와 요약함수(KD)이다.

단방향 해시함수는 데이터의 MD5를 계산하고, 요약함수는 비밀데이터와 일반데이터 각각의 MD5를 계산하게 된다.

인증 중에 메시지가 오가는 과정을 효율화하기 위해 '사전인가'라는 기능이 있다.

클라이언트가 서버에서 보내올 난수값을 미리 알아 요약값과 함께 Authorization 헤더를 미리 만들어두는 것이다.

이를 위해서는 서버가 인증시 다음 난수 값을 Authentication-info헤더에 담아 미리 보내두거나,

짧은 시간 내 난수값을 재사용하는 것을 허락하는 방법 등이 있을 수 있다.

난수값을 생성하는 가장 대표적인 RFC 2617 방법으로는 타임스탬프와 요청된 엔터티에 대한 Etag 헤더 값, 개인 키를 사용한다.

서버는 클라이언트로 부터 받은 난수값을 재계산하여 타임스탬프가 오래되었거나 난수가 일치하지 않을 경우 거절하게 된다.

qop(Quality of Protection) 필드에 대해 추가적으로 알아보자.

이 필드는 WWW-Authenticate, Authorization, Authentication-info 모두에 존재할 수 있다.

서버는 가장 처음에 클라이언트에게 qop옵션을 쉼표로 구분하여 보내게 되고, 클라이언트는 그 중 선택하여 돌려준다.

qop옵션 값은 두 가지가 대표적인데, 인증을 의미하는 'auth'와 인증 및 메시지 무결성 보호를 의미하는 'auth-int'이다.

auth-int일때는 메시지 본문이 아니라 엔터티 본문의 해시값을 계산한다.

1) 인증 요구 : 서버 > 클라이언트, WWW-Authentication : Basic / Digest realm=<영역값>

2) 인증 응답 : 클라이언트 > 서버, Authorization: Basic <base64(user:pass)>

AUthorization: Digest username, realm, nonce, uri, response ...

3) 정보 : 서버 > 클라이언트, Authentication-Info : nextnonce, qop, rspauth, cnonce, nc...

서버는 클라이언트가 요청한 인증 정보가 올바르지 않을 때, 400 Bad Request를 내보내게 되는데, 이에 대한 기록이 필요하다.

특정 클라이언트가 지속적으로 해당 오류 상태코드를 받게 된다는 것은, 비밀번호 추측을 하고 있다는 의미일수도 있기 때문이다.


참고도서

https://book.naver.com/bookdb/book_detail.nhn?bid=8509980

 

HTTP 완벽 가이드

성공적인 웹 트랜잭션 뒤의 숨은 핵심, HTTP의 모든 것『HTTP 완벽 가이드』는 HTTP 규약이 어떻게 작동하고 웹 기반 애플리케이션을 개발하는 데 어떻게 사용하는지 설명하고, HTTP가 효율적으로 동작하도록 함께 사용하는 다른 핵심 인터넷 기술에 대해서 소개한 책이다. 책에서는 HTTP 메서드, 헤더, 상태 코드, 프락시와 캐시의 최적화, 웹 로봇과 크롤러 설계 전략, 쿠키, 인증, 보안 HTTP, 국제화와 내용 협상, 리다이렉션과 부하 균형 전략, 더 좋은 성능의 HTTP, HTTP/2.0에 대해서 다루고 있다. 또한, 10...

book.naver.com

반응형

'Tech' 카테고리의 다른 글

HTTP - 인증 : Oauth, JWT, Bearer token  (0) 2021.06.14
HTTP - (8) HTTPS, 보안  (0) 2021.06.14
HTTP - (6) 클라이언트 식별과 쿠키, 인증  (0) 2021.06.06
HTTP - (5) HTTP/2.0  (0) 2021.05.30
HTTP - (4) 웹로봇  (0) 2021.05.30