12. 기본 인증
Last updated
Was this helpful?
Last updated
Was this helpful?
웹은 많은 사람들이 편리하게 접근하고 공유할 수 있는 공간이다.
하지만 공유하길 원하지 않는 정보들에 대해 허가된 사용자만이 접근할 수 있는 공간의 필요성도 존재한다
인증의 기본 개념은 사용자가 누구인지 증명하는 것이다
물론 완벽한 인증은 존재하지 않지만, 정보가 많을수록 제대로 식별할 가능성이 높아진다
HTTP는 자체 인증요구/응답 프레임워크를 제공한다
서버는 인증 요청을 하고, 클라이언트는 사용자의 인증 정보를 첨부해 다시 요청을 보낸다
HTTP는 customize 가 가능한 제어 헤더를 통해 여러 인증 프로토콜에 맞게 확장할 수 있는 프레임워크를 제공한다
네 가지 인증 단계
요청
인증 요구
Basic : 기본 인증 스킴으로 ID/PW 를 base64 encoding 하여 전달
realm : 인증을 요구하는 공간이나 범위에 대한 설명
인증
WWW-Authenticate 헤더에 정의된 스킴에 맞춰 Authorization 헤더에 ID/PW 쌍을 기술하여 전송
Authentication-info
추가적인 인증 알고리즘에 대한 정보를 기술
HTTP가 각 리소스마다 다른 접근 조건을 다루는 방법
realm (보안 영역)
접근이 제한된 문서들을 realm 그룹으로 나눔
realm 그룹은 각각 다른 사용자 권한을 요구
realm 은 사용자가 권한의 범위를 이해하는 데 도움이 되는 형식으로 설정되어야 한다
웹 서버는 클라이언트의 요청을 거부하고 ID/PW 를 요구할 수 있다
401 status code 와 함께 WWW-Authenticate 헤더에 스킴과 realm 을 기술하여 응답을 내려 인증 요구를 시작
Authentication-Info 헤더를 사용하지 않음
HTTP기본 인증은 사용자 이름과 비밀번호를 콜론으로 이어서 합치고 base-64 인코딩을 한다
binary data 를 6bits 단위로 끊어 공통의 ASCII 문자로 변환
왜 base64 인코딩을 하지? base64 인코딩은 6bits 를 하나의 character 로 변환하기 때문에 2bits 의 overhead 가 발생하며, encode-decode 과정에서 추가적인 cpu 연산까지 발생하는데 왜 base64 encoding 을 해서 전송하는 것일까?
ASCII 는 7bits encoding 방식을 사용하기 때문에 남은 1bit 의 처리가 시스템별로 다르게 구현되어 있을 수 있다. 또한 일부 제어문자의 경우 시스템별로 다른 코드값을 가진다
따라서 공통 ASCII 코드문자로만 이루어진 데이터를 전송하여 예상치 못한 호환 문제를 방지하고, 추가적으로 HTTP 헤더에서 사용할 수 없는 문자를 포함한 문자열을 처리하기 위해 base64 encoding 을 사용하는 것
프락시 서버를 사용하면 접근 정책을 중앙 관리할 수 있어 프락시를 통한 사용자 인증을 사용하는 경우도 있다
기본 인증은 해당 요청이 탈취당했을 경우 누구나 쉽게 디코딩해서 인증 정보를 확인할 수 있다
탈취당해도 원본을 확인할 수 없는 TLS 같은 암호화 채널을 사용하거나 다이제스트 인증 같은 프로토콜을 사용
탈취한 인증 정보를 직접 디코딩 할 수 없더라도 서버로 해당 문자열들 그대로 보내 인증에 성공할 수 있다
기본 인증은 재전송 공격을 방지하기 위한 장치가 없음
중간에 프락시와 같은 중개자에 의해 인증 헤더가 아닌 다른 부분을 수정하여 트랜잭션의 의도를 바꾸는 경우 정상적인인증 동작을 보장하지 않는다
인증 정보를 요청하는 가짜로 위장한 서버에 대한 대책이 없다
기본인증은 우연한 사고를 예방하기 위한 1차적인 방어수단정도로 사용된다