실버라이트와 Referer

Silverlight/Lecture 2008.11.09 13:36


1. What's Referer

모두 아시다시피 레퍼러(표준은 Referrer, 하지만 Referer라고 많이 씀)는 현재 웹페이지에 도착하기 위해서,
어느 페이지를 거쳐왔느냐 하는 정보를 뜻합니다.

이 정보는 이전 페이지에서 다음 페이지를 호출할 때 HTTP Header에 실어서 보내는 정보입니다.

예를 들어 네이버에서 "휴즈플로우"를 검색한 다음,



링크를 클릭하게 되면, 휴즈플로우 웹사이트로 이동하게 되는데, 이 때 호출되는 Request Header를 살펴보면,
아래와 같이 Referer 정보가 있습니다. (Fiddler를 통해서 볼 수 있습니다.)



이 정보를 이용해서 구글 애널러틱스나 블로그 관리자 모듈에서 유입경로 데이터가 만들어지게 되는 것이죠.
이게 바로 Referer입니다.


2. 실버라이트에서 Referer 얻기

실버라이트에서 Referer는 다음과 같이 간단한 방법으로 참조할 수 있습니다.

string referer = HtmlPage.Document.GetProperty("referrer").ToString();

아래 실버라이트 어플리케이션에서는 위의 코드를 이용하여 여러분이 이 페이지에 접근한 경로를 표시하고 있습니다.
(직접 URL을 브라우져 주소창에 입력하여 접근한 경우에는 아무 것도 표시 되지 않을 것입니다.)



이것을 잘 활용하면, 원하는 경우 특정 도메인 이외의 곳에서 (iframe 등의 방법으로) 자신의 실버라이트 어플리케이션이 실행되는 것을 차단할 수도 있습니다.


3. 실버라이트에서 Referer 정보 실어보내기

실버라이트에서 특정 웹페이지를 호출하면, 그 웹페이지에서는 Referer를 얻을 수 있을까요?
실버라이트 1.1 때 이미 이 문제를 시험해 보았습니다만, 실버라이트는 흔적(Referer)을 남기지 않았습니다.
실버라이트 2에서도 마찬가지입니다.

아래 버튼을 눌러 봄으로써 테스트 해보실 수 있습니다.

새로 뜬 창의 2.실버라이트에서 Refere 얻기에서 등장한 Referer 표시기에는 Referer가 표시되어 있기를 기대 합니다만,
아무 것도 없을 것입니다.



하지만 HTML Anchor 태그를 사용한 이 링크를 클릭하면 Referer가 표시되는 것을 확인하실 수 있으실 겁니다.

WebClient나 HttpWebRequest를 이용하여 웹페이지를 호출하는 경우에도 마찬가지로 흔적을 남기지 않습니다.
WebClient나 HttpWebRequest의 전송 Header에 아래와 같이 Referer를 실어 보내려고 시도해봤지만,

WebClient wc = new WebClient();
wc.Headers[HttpRequestHeader.Referer] = HtmlPage.Document.DocumentUri.ToString();


아래와 같은 예외를 발생시키네요.



꼭 Referer를 보내야 한다면 이제 방법은 하나 밖에 없습니다.
솔직하게, 적극적으로 정보를 실어 보내는 것이지요.
예를 들면 아래 코드처럼 말이죠.
(물론 보안 상 좋지 않을 수도 있어요.)

public void SendFeedback()
{
    string feedbackUrl = string.Format("http://도메인/피드백수집페이지URL?referer={0}", HtmlPage.Document.DocumentUri.ToString());

    WebClient wc = new WebClient();
    wc.DownloadStringAsync(new Uri(feedbackUrl));
}

감사합니다.


설정

트랙백

댓글

  • BlogIcon wafe 2008.11.09 23:02 신고 ADDR 수정/삭제 답글

    Silverlight 는 웹 접근에 제약이 있으니 리퍼러가 크게 중요하지 않은 것 아닐까요?

    • BlogIcon 길버트 2008.11.10 20:25 신고 수정/삭제

      wafe님이 말씀하신 대로 Silverlight는 웹 접근에 제약이 있습니다만,
      그것은 Silverlight가 타 서버의 데이터에 접근하는데 대한 제약을 의미합니다.
      실버라이트란 녀석이 워낙 조심성이 많은 녀석이어서 말이죠. ^^

      다른 서버에서 내 실버라이트 어플리케이션을 가져다 쓰는 데는 제약이 없습니다.
      하이재킹을 방지하고 싶을 때는 (이런 때가 항상 있는 것은 아니지만 원하는 경우)
      Referer를 활용할 수 있다면 편합니다.

      다른 예를 들어볼게요.
      실버라이트로 위젯을 만들었다면 그 위젯을 통해서,
      페이지 뷰, 레퍼러 등의 데이터를 수집할 필요가 있습니다.
      다수의 위젯들이 그렇게 행동하고 있습니다.
      특히 마케팅 위젯이라면 이런 정보는 필수입니다.

      이런 경우 실버라이트 위젯은 Referer를 위해 꼼수를 부리거나,
      위젯을 표시하기 위한 코드에 실버라이트 이외에 다른
      엑스트라 코드가 더 필요하게 되는 것이죠.

      헤더에 제대로 된 Referer를 실어주는 것은
      웹어플리케이션에 있어서는 표준이라고 생각해요.
      실버라이트에서 Referer를 제대로 지원하면,
      그만큼 신뢰성이 높아지게 된다고 생각합니다.

  • BlogIcon wafe 2008.11.10 19:41 신고 ADDR 수정/삭제 답글

    아하 제가 다른 서버에서 가져다 쓰는데 제약이 없다는 생각을 못하고 있었네요. 항상 내가 지정한 곳에서만 접근하니까 직접적으로 리퍼러를 제공하지 않아도 우회적으로 동일한 정보를 유추할 수 있다고 생각했는데, 제 불찰입니다. 좋은 거 하나 배웠어요 감사합니다. :)

    • BlogIcon 길버트 2008.11.11 09:45 신고 수정/삭제

      도움이 되셨다니 다행이예요.
      앞으로도 실버라이트 꾸준히 사랑해 주세요.
      감사합니다.