[Book - 그림으로 배우는 Http & Network Basic] 8. 누가 액세스하고 있는지를 확인하는 인증
인증이란?
서버에 액세스하고 있는 사람이 누군지 알려면 상대방 클라이언트에 이름을 알려 달라고 해야 한다.
시스템에 액세스하는 권한을 본인인지 아닌지 확인하기 위해서 [등록된 본인만이 알고 있는 정보]나 [등록한 본인만이 가지고 있는 정보] 등으로 확인할 필요가 있다.
패스워드
본인만이 알고 있는 문자열 정보
원타임 토큰
본인만이 가지고 있는 기기 등에 표시되는 한 번 쓰고 버리는 패스워드 등의 정보
전자 증명서
본인(단말기)만이 가지고 있는 정보
바이오 매트릭스
지문이나 홍채 등 본인의 신체 정보
IC 카드 등
본인만이 가지고 있는 정보
단, 상대가 가짜라 하더라도 본인 확인을 하기 위한 정보를 제시할 수 있다면 컴퓨터는 본인으로 인식해 버린다.
HTTP에서 사용하는 인증 방법
- BASIC 인증
- DIGEST 인증
- SSL 클라이언트 인증
- 폼 베이스 인증
BASIC 인증
BASIC 인증은 웹 서버와 대응하고 있는 클라이언트 사이에서 이뤄지는 인증 방식이다.
BASIC 인증에서 Base64라는 인코딩 형식은 암호화는 아니기 때문에 아무런 부가 정보 없이도 복호화 할 수 있다.
한번 BASIC 인증을 하면 일반 브라우저에서는 로그아웃할 수 없다.
보안 등급에는 미치지 못한다는 면에서 그다지 사용되고 있지는 않다.
DIGEST 인증
DIGEST 인증에는 챌린지 리스폰스 방식이 사용되고 있어서 BASIC 인증과 같이 패스워드를 있는 그대로 직접 보내는 일은 없다.
챌린지 리스폰스 방식은 최초에 상대방에게 인증 요구를 보내고 상대방 측에서 받은 챌린지 코드를 사용해서 리스폰스 코드를 계산한다. 이 값을 상대에게 송신하여 인증을 하는 방법이다.
DIGEST도 BASIC과 마찬가지로 보안 등급에는 미치지 못한다는 면에서 그다지 사용되고 있지는 않다.
SSL 클라이언트 인증
클라이언트 증명서를 인증할 때에 사용하는 방식으로 사전에 등록된 클라이언트에서의 액세스인지 아닌지를 확인할 수 있다.
SSL 클라이언트 인증을 할 때에는 사전에 클라이언트에 클라이언트 증명서를 배포하고 install 해둘 필요가 있다.
- 인증이 필요한 리소스의 Request가 있었을 경우에는 서버는 클라이언트에게 클라이언트 증명서를 요구하는 “Certificate Request”라는 메시지를 송신한다.
- 유저는 송신하는 클라이언트 증명서를 선택하고, 클라이언트는 클라이언트 증명서를 “Client Certivicate”라는 메시지를 송신한다.
- 서버는 클라이언트 증명서를 검증하여 검증 결과가 정확하다면 클라이언트의 공개키를 취득한다. 그 이후에 HTTPS에 의한 암호를 개시한다.
SSL 클라이언트 인증은 대부분의 경우 단독으로 사용되지는 않고, 이후에 다룰 폼 베이스 인증과 합쳐서 2-factor 인증의 하나로서 이용되고 있다.
즉, 첫 번째 인증 정보로서 SSL 클라이언트 인증을 사용하여 클라이언트의 컴퓨터를 인증하고, 다른 인증 정보로서 패스워드를 사용하여 유저의 본인 확인을 한다.
SSL 클라이언트 인증에서는 클라이언트 증명서를 이용할 필요가 있다. 이 클라이언트 증명서를 이용하기 위해서는 비용이 필요하게 된다.
즉, 안전하게 운용하기 위해서는 상당한 비용이 발생한다.
폼 베이스 인증
클라이언트가 서버 상의 웹 애플리케이션에 자격 정보(Credential)를 송신하여 그 자격 정보의 검증 결과에 따라 인증을 하는 방식이다.
웹 애플리케이션에 따라 제공되는 인터페이스나 인증의 방법이 다양하다.
웹 사이트의 인증 기능으로서 요구되는 기능의 레벨을 충족시킨 표준적인 것이 존재하지 않기 때문에 웹 애플리케이션에서 제각각 구현하는 폼 베이스 인증을 사용한다.
폼 베이스 인증은 일반적으로 세션 관리를 위해서 쿠키를 사용하는 방법을 자주 사용한다.
HTTP는 스테이트리스 프로토콜이기 때문에 방금 전에 인증을 성공했던 유저라는 상태를 프로토콜 레벨에서는 유지할 수 없다. 즉, 상태 관리가 안되기 때문에 다음에 그 유저가 액세스했다고 하더라도 다른 유저와 구별하지 못한다.
따라서, 세션 관리와 쿠키를 사용하여 HTTP에 없는 상태 관리 기능을 보충한다.