##본 포스팅은 '그림으로 배우는 Http & Network Basic - 우에노 센'을 읽고 쓴 요약/정리 글입니다.
웹에는 특정 인물에게만 보여주고 싶은 페이지나 자기 자신의 전용 페이지 등이 필요하게 되는 일이 있다.
그러기 위해서 필요한 기능이 인증이다.
BASIC 인증
HTTP 1.0에 구현된 인증 방식으로 현재도 일부 사용되고 있다.
BASIC 인증은 웹 서버와 대응하고 있는 클라이언트 사이에서 이뤄지는 인증 방식이다.
[순서]
1) 리퀘스트 송신
2) 상태 코드 401로 응답하여 인증이 필요하다는 것을 전달
3) Authorization : Basic + 세션 을 통해 자신의 ID:PW를 Base64로 인코드하여 문자열을 만들어 보낸다. 유저가 브라우저로 입력을 한다면 이 입력은 브라우저가 자동적으로 Base64로 반환한다.
4) 서버에서 확인 후, 인증 정보가 정확하면 Request-URI 리소스를 포함한 리스폰스를 반환한다.
BASIC 인증에서는 Base64라는 인코딩 형식을 사용하고 잇지만, 암호화는 아니기에 아무런 부가 정보 없이도 복호화할 수 있다.
그러므로 그대지 사용되고 있지는 않다.
DIGEST 인증
DIGEST는 HTTP/1.1에 소개되어있다.
챌린지 리스폰스 방식이 사용되고 있기에 패스워드를 있는 그대로 직접 보내는 일은 없다.
[순서]
1)클라이언트에서 상대방에게 인증 요구를 보냄
2) 챌린지 코드를 사용해서 리스폰스 코드를 계산한다.
3) 이 값을 상대에게 송신하여 서버에 인증을 한다.
하지만 DIGEST에서도 도청을 방지하기 위한 보호 기능은 제공하고 있지 않지만 이외에 위장을 방지하는 기능은 제공하고 있지 않기때문에
BASIC과 마찬가지로 사용상의 문제와 많은 웹 사이트에서 요구되는 보안 등급에는 미치지 못한다는 점에서 그다지 사용되고 있지는 않다.
SSL 클라이언트 인증
SSL 클라이언트 인증은 HTTPS의 클라이언트 인증서를 이용한 인증 방식이다.
사전에 등록된 클라이언트에서의 액세스이너지 아닌지를 확인할 수 있다.
[순서]
1) 인증이 필요한 리퀘스트를 하면, 서버는 "Certificate Request"라는 메시지를 송신한다.
2) 유저는 송신하는 증명서를 선택하여 "Client Certificate"라는 메시지를 송신한다.
3) 서버는 클라이언트 증명서를 검증하여 검증 결과가 정확하다면 클라이언트의 공개키를 취득하고, 이후 HTTPS에 의한 암호를 개시한다.
SSL 인증은 단독으로 사용되지는 않고, 폼 베이스 인증과 합쳐져 2-factor 인즈으이 하나로서 이용되고 있다.
즉, 젓번째 인증정보로 클라이언트 커뮤터를 인증하고, 다른 인증 정보로 패스워드를 사용하여 유저의 본인 확인을 한다.
하지만 SSL 클라이언트 인증은 이용하는데 비용이 필요하기에 상당한 리소스가 필요하다.
폼 베이스 인증
폼 베이스 인증은 HTTP 프로토콜로서 사양이 정의되어 있는 인증 방식은 아니고,
클라이언트가 서버 상의 웹 어플리케이션에 자격 정보를 송신하여 그 자격 정보의 검증 결과에 따라 인증을 하는 방식이다.
인증의 대부분은 폼 베이스 인증이며, 각 웹 어플리케이션에서 제각각 구현하고 있다.
[세션 관리와 쿠키에 의한 구현]
폼 베이스 인증은 표준적인 사양이 결정되어있지 않지만 일반적으로 자주 사용되고 있는 방법으로는 세션 관리를 위해서 쿠키를 사용하는 방법이 있다.
HTTP는 스테이트리스 프로토콜이기 때문에 인증을 성공했던 유저라는 상태를 프로토콜 레벨에서 유지할 수 없으므로, 세션과 쿠키를 사용하여 상태 관리 기능을 보충한다.
[순서]
1) 자격 정보인 유저 ID나 패스워드를 POST 메소드를 사용하여 엔티티 바디에 자격 정보를 저장한다.
2) 서버 측은 유저를 식별하기 위해서 세션 ID를 발행한다. 클라이언트에서 수신한 자격 정보를 검증하는 것으로 인증을 하고, 그 유저의 인증 상태를 세션 ID와 연관지어 서버측에 기록한다. 그 후 세션 ID를 Set-Cookie를 통해 쿠키로 송신한다.
서버 측에서는 유효기한을 관리해야하고, 쿠키에는 httponly 속성을 부여해 둬야한다.
3) 세션 ID를 받은 클라이언트는 쿠키로 저장해둔다. 다음번에 서버에 리퀘스트를 송신하는 때에는 브라우저가 자동으로 쿠키를 송출하기 때문에 세션 ID가 서버에 송신된다.