Silverlight/Lecture

실버라이트와 Referer

길버트 2008. 11. 9. 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));
}

감사합니다.