이 장에서는 서버가 통신하는 대상을 식별하는데에 사용하는 기술을 알아본다.
HTTP는 익명으로 사용하며 상태가 없고 요청(Request)과 응답(Response)로 통신하는 프로토콜
현대의 웹 사이트들은 개인화된 서비스들을 제공하고 싶어한다.
개인에게 맞춰져 있는 것처럼 느끼게 하려고 사용자에게 특화된 환영 메세지나 페이지 내용을 만듦
고객의 흥미가 무엇인지 학습해서 고객이 좋아할 만한 상품을 추천해준다.
개개인의 기념일이나 생일이 다가오면 그에 맞는 상품을 제시할 수도 있다.
배송지 주소와 카드 정보를 매번 입력받게 하지말고
데이터베이스에 저장하여 저장하는 경우를 말한다.
HTTP 트랜잭션은 상태가 없다.
각 요청, 응답은 독립적으로 일어난다.
사용자가 사이트와 상호작용 할 수 있게 사용자의 상태를 남기는데,
여러 상태들을 유지하려면, 웹 사이트는 HTTP 트랜잭션을 식별할 방법이 필요하다.
헤더 이름 | 헤더 타입 | 설명 |
---|---|---|
From | 요청 | 사용자의 이메일 주소 |
User-Agent | 요청 | 사용자의 브라우저 |
Referer | 요청 | 사용자가 현재 링크를 타고 온 근원 페이지 |
From 헤더
사용자의 이메일 주소를 포함
고유한 이메일 주소를 갖기 때문에 이론상 From헤더로 사용자를 식별할 수 있다.
악의적 서버가 이 이메일 주소들을 모아 스팸메일을 발송할 수 있는 문제가 있다.
로봇이나 스파이더는 본의 아니게 웹 사이트에 문제를 일으킨 경우, 항의 메일을 보낼 수 있도록
From헤더에 이메일 주소를 기술한다고 함
User-Agent 헤더
사용자가 쓰고 있는 브라우저의 이름과 버전정보, 등등을 서버에게 알려준다.
이는 특정 브라우저에게 특화된 컨텐츠를 최적화하는데 도움을 줄 수 있지만,
특정 사용자들을 식별하는 데는 큰 도움이 되지 않는다.
Referer 헤더
사용자가 현재 페이지로 유입하게 한 웹페이지의 URL을 가리킨다.
이 헤더로 이전에 어떤 페이지를 방문했었는지 알 수 있다.
왜?
- 여기까지 들어오기 직전의 URL을 파악할 수 있기 때문에 유추할 수 있게 된다.
하지만 이 세가지 헤더로 확실하게 뭔가를 식별하기엔 정보가 부족함.
사용자가 확실한 IP 주소를 가지고 있고, 그 주소가 바뀌지 않고, 웹 서버가 요청마다
클라이언트 IP를 알 수 있다면 문제없이 동작한다.
클라이언트 IP 주소는 사용자가 아닌, 사용하는 컴퓨터를 가리킴.
여러 사람이 이용하는 경우 그들을 식별할 수 없다.
인터넷 서비스 제공자는 동적으로 IP주소를 할당
그렇기 때문에 사용자를 IP 주소로 식별할 수 없음
보안을 강화하고 부족한 주소들을 관리하려고 NAT 방화벽을 통해 인터넷을 사용함.
클라이언트의 실제 IP 주소를 방화벽 뒤로 숨기기 때문에 식별할 수 없음
HTTP 프락시와 게이트웨이는 원서버에 새로운 TCP 연결
이렇게 되면 실제 IP주소가 아닌 프락시의 IP주소를 보게 됨
IP 주소로 식별하는 수동적 방식보다,
웹 서버는 사용자 이름과 비밀번호 인증을 요구하여 명시적으로 식별할수 있다.
WWW-Authenticate
, Authorization
헤더를 사용하여 사용자 이름을 전달하는 체계를 갖고 있음.
자세한 내용은 12장에서 다룰 예정
어떤 웹 사이트는 사용자의 URL마다 버전을 기술하여 사용자를 식별하고 추적했다.
뚱뚱한 URL이란?
사용자의 상태 정보를 포함하고 있는 URL
사용자와 관련된 정보를 찾아서 밖으로 향하는 모든 하이퍼링크에 정보를 포함하기 때문에
뚱뚱한 URL이 되고,
이 뚱뚱한 URL은 심각한 문제들이 있다.
브라우저에 보이는 뚱뚱한 URL은 새로운 사용자에게 혼란을 준다.
당연한 얘기인것은, 이 뚱뚱한 URL에 사용자에 관련된 정보들이 포함되어 있다.
그렇기에 공유하는 순간 내 개인정보들도 같이 공유한다는 것이 된다.
URL로 만드는 것은, 계속해서 요청되는 URL이 변경되기 때문에 기존 캐시에 접근할 수 없다.
서버는 뚱뚱한 URL에 해당하는 HTML 페이지를 다시 그려야 한다.
URL에 정보들이 추가된것만 사용해야 문제없이 동작한다.
하지만 중간에 사용자가 이탈하게 되면, 진행상황들이 다 리셋이 되는 경우가 발생할 것이다.
특정 URL을 저장해놓지 않는 이상은, 로그아웃하게 되면 정보를 전부 잃는것이 된다.
쿠키는 사용자를 식별하고 세션을 유지하는 방식 중, 현재 가장 널리 사용하는 방식
쿠키는 넷스케이프에서 개발했지만, 지금은 모든 브라우저에서 지원한다.
쿠키는 캐시와 충돌할 수 있어서, 대부분의 캐시나 브라우저는 쿠키에 있는 내용물을
캐싱하지 않는다.
쿠키는 세션쿠키, 지속쿠키 두가지 타입이 존재
세션 쿠키 - 사용자가 브라우저를 닫으면 삭제되는 쿠키
지속 쿠키 - 삭제되지 않고 더 길게 유지될 수 있는 쿠키
두개의 차이점은 파기되는 시점
파기까지 남은 시간인 Expires
또는 Max-Age
파라미터가 없다면 세션 쿠기가 된다.
사용자가 웹 사이트에 방문하면, 웹사이트는 서버가 사용자에게 할당한 값들을 모두 읽을 수 있다.
쿠키는 임의의 이름=값 형태의 리스트를 가지고, Set-Cookie
or Set-Cookie2(확장 헤더)
와 같은 HTTP 응답 헤더에 기술되어
사용자에게 전달 된다.
쿠키의 기본은 브라우저가 서버 관련 정보를 저장하고, 사용자가 해당 서버에 접근할 때 마다
그 정보를 함께 전송하게 하는 것
브라우저가 쿠키 정보를 저장할 책임이 있는데 이게 클라이언트 측 상태 = HTTP 상태 관리 체계
브라우저는 수백 수천 개의 쿠키를 가지고 있을 수는 있지만,
브라우저가 쿠키 전부를 모든 사이트에 보내지는 않는다.
Set-cookie: user="lsj8367"; domain="sprout.or.kr"
sprout.or.kr
도메인에 user="lsj8367"
을 전달한다라는 의미
Path 속성으로 해당 경로쪽에 속하는 페이지만 쿠키를 전달하게 하는 속성
넷스케이프 쿠키
Set-Cookie 속성
;
, ,
, =
, 공백 을 포함하지 않는 문자열요일, DD-MM-YY HH:MM:SS GMT
Set-Cookie
응답을 생성한 서버의 호스트명을 사용Set-Cookie
응답을 전달하는 URL의 경로 사용Set-Cookie2 속성
$
는 예약된 문자이므로 쿠키 이름은 $
로 시작하면 안된다.초 단위
쿠키는 웹 사이트에 수차례 트랜잭션을 만들어내는 사용자를 추적하는데 사용한다.
쿠키 트랜잭션과 관련된 문서를 캐싱하는 것을 주의해야 한다.
이유?
이전 사용자의 쿠키가 다른 사용자에게 할당되거나, 개인정보까지도 노출이 될 수 있다.
캐시되지 말아야 할 문서가 있다면 표시해라
문서가 Set-Cookie
헤더를 제외하고 캐시해도 되는 경우라면,
그 문서에 명시적으로 Cache-Control: no-cache="Set-Cookie"
를 기술하여 명확히 표시한다.
캐시를 해도 되는 문서에 Cache-Control: public
을 사용하면 웹의 대역폭을 더 절약시켜준다.
Set-Cookie 헤더를 캐시 하는 것에 유의하라
같은 Set-Cookie
헤더를 여러 사용자에게 보내게 되면, 사용자 추적에 실패할 것
어떤 캐시는 Set-Cookie
헤더를 응답 저장전에 제거한다.
이런 문제를 방지하기 위해서 모든 요청마다 캐시가 원 서버와 재검사를 시켜 Set-Cookie
헤더 값을 주어
이 문제를 개선할 수 있다.
Cache-Control: must-revalidate, max-age=0
Cookie 헤더를 가지고 있는 요청을 주의하라
요청에 Cookie 헤더와 같이 넘겨지면, 결과가 개인정보를 담고 있을 수 있다.
쿠키를 사용하지 않도록 비활성화도 가능하기 때문에, 이 자체가 보안상으로 위험하다고 할수는 없다.
개인정보를 다루거나 사용자를 추적하는 기술은 잘못된 의도로 사용할 수 있기 때문에 주의하여야 한다.
가장 큰 오용중 하나는 사용자 추적을 위한 지속 쿠키이다.
개인 정보를 누가 받는지 명확하게 파악하고, 개인정보 정책을 유의한다면
위험성 보다는 세션 조작이나 트랜잭션상 편리함이 크다.