적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

웹 개발

HTTP referer 란? (+ send referer header in iOS)

hongssup_ 2022. 9. 1. 10:08
반응형

HTTP referer 란?

HTTP 프로토콜에는 referer 라는 헤더 값이 있는데, 이 referer를 통해 현재 웹페이지가 어디로부터 이동이 되었는지 경로를 알 수 있다.

헤더에 "referer"를 추가하여 웹으로 보내면 특정 앱 혹은 웹사이트에서 유입된 방문자 추적이 가능하기에,   

웹사이트의 방문객이 어떤 경로로 방문했는지 알아볼 때 유용하게 사용된다. (유입 분석)

 

간단히 말해 referer는 현재 페이지의 헤더에 담겨있는 이전 페이지의 uri 정보라고 할 수 있다. 

대부분의 웹서버에는 이전 브라우저가 송신한 HTTP referer를 기록하고 있지만, 보안상 referer 정보를 송신하지 않는 설정을 하기도 한다. 올바른 referer 정보를 송신하지 않는 브라우저에 대해 엑세스를 블록해 버리기도 한다. 

참고 : [WEB] HTTP referer란?

 

iOS 에서 헤더에 referer 심어서 웹페이지 띄우는 법 

우선 iOS에서 웹 페이지를 띄우는 방법에는 세 가지가 있다. (참고 : 앱에서 Web 페이지 여는 방법 세 가지)

- 외부 브라우저(사파리)로 열기 

- SFSafariViewController 

- WKWebView 

 

이 중에서 header 에 referer 값을 넣어 보낼 수 있는 방법은 내가 알아본 바에 의하면 WKWebView 만 가능하다고 한다. 

(혹시 다른 방법 아시는 분 있으면 말씀해주세요!)

그렇다면 외부 브라우저를 사용하는 나머지 두 방법은 referer를 보낼 방법이 없는건가? 

앱 내에서만 본다면 그렇다. 하지만 referer 로그를 남길 수 있는 bridging 웹페이지를 하나 따로 만들어 주는 방법도 있다. 

 

1. 인앱 웹뷰에 referer 심어보내기

WKNavigationDelegate 프로토콜을 추가해주고 다음과 같이 설정을 해준다.

헤더 필드에 "referer" 로 보낼 값을 설정해준 후, 헤더에 값이 잘 들어갔는지 debugPrint 해볼 수 있다. 

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    var request = navigationAction.request
    request.setValue("hongssup.tistory.com", forHTTPHeaderField: "referer")
    if let headers = request.allHTTPHeaderFields {
        debugPrint("Headers: \(headers)")
    }
    decisionHandler(.allow)
}

참고 : StackOverflow

 

2. Bridge 페이지 만들어서 redirection 해주기

referer : 현재 웹페이지 넘어오기 전 웹페이지의 url 기록 (따로 custom 하는게 아니라 자동으로 남는 것)

bridge page : 앱에서 referer 심을 없으니 referer 기록을 남길 있는 redirection 용 web page 하나 따로 만들어 주는 . 

 

즉, iOS 앱 내에서 외부 브라우저로 이동할 때는 header에 referer를 따로 심어줄 수가 없기에, 원하는 페이지로 redirection 해줄 bridging 페이지를 하나 추가로 만들어주는 방법이다.

(안드로이드에서는 크롬뷰를 사용하면 bridge page 없이도 그냥 헤더에 referer 추가가 가능하다고 한다...) 

728x90
반응형

'웹 개발' 카테고리의 다른 글

티스토리에 수식 입력하는 방법  (0) 2022.12.16
[크롬 개발자 도구] 웹페이지 디버깅 전체 검색 하는 법  (0) 2022.01.06
Web Application Server, WAS  (0) 2021.11.04
CSRF token mismatch  (0) 2021.09.16
HTML  (0) 2021.09.03