アプリ内ブラウザと広告配信についての調査結果

先日、Facebookアプリから開いた記事ページ内にFacebookの広告が表示されるという事象が発生したため、アプリ内ブラウザと広告配信について調べてみた。

## 調査目的
Facebookアプリから開いた記事ページ内にFacebookの広告が表示されるような広告配信を防ぐことはできないのか。また、防げるとすればどうすればいいのかを把握するため。

## 調査対象
- Facebook
- Gunosy
- SmartNews
- NewsPicks
- Anntena

## 調査対象選択基準
- ダウンロード数が多い
- 独自のアプリ内ブラウザを用いて1次メディアの記事を表示している

## 調査方法
- [burpsuite](http://portswigger.net/)を用いてローカルPCにプロキシサーバを構築
- スマートデバイス（iPhone4S/iOS8.1）にプロキシの設定を行い、調査対象のアプリを開き、アプリの通信内容を確認

## 調査結果
<dl>
<dt>RequestHeader[記事]</dt>
<dd>アプリブラウザから記事ページを取得した際のRequestHeader
</dd>
<dt>RequestHeader[広告]</dt>
<dd>アプリブラウザから記事ページ内の広告を取得した際のRequestHeader</dd>
</dl>
※記事や広告のURLは伏せてあります。

#### Facebook
```html:RequestHeader[記事ページ]
GET [記事ページのURL] HTTP/1.1
Host: [記事ページのURL]
Referer: https://m.facebook.com
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411 [FBAN/FBIOS;FBAV/17.0.0.14.13;FBBV/4950859;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.1;FBSS/2; FBCR/
```

```html:RequestHeader[広告]
GET [広告のURL] HTTP/1.1
Host: [広告のURL]
Referer: [記事ページのURL]
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411 [FBAN/FBIOS;FBAV/17.0.0.14.13;FBBV/4950859;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.1;FBSS/2; FBCR/
```

#### Gunosy
```html:RequestHeader[記事ページ]
GET [記事ページのURL] HTTP/1.1
Host: [記事ページのURL]
Referer: http://gunosy.com/g/gLboe
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

```html:RequestHeader[広告]
GET [広告のURL] HTTP/1.1
Host: [広告のURL]
Referer: [記事ページのURL]
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

#### SmartNews
```html:RequestHeader[記事ページ]
GET [記事ページのURL] HTTP/1.1
Host: [記事ページのURL]
Referer: https://www.smartnews.com/
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

```html:RequestHeader[広告]
GET [広告のURL] HTTP/1.1
Host: [広告のURL]
Referer: [記事ページのURL]
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
Cookie: [広告のCookie]
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

#### NewsPicks
```html:RequestHeader[記事ページ]
GET [記事ページのURL]?ref=newspicks HTTP/1.1
Host: [記事ページのURL]
Referer: http://newspicks.com/
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

```html:RequestHeader[広告]
GET [広告のURL] HTTP/1.1
Host: [広告のURL]
Referer: [記事ページのURL]?ref=newspicks
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
Cookie: [広告のCookie]
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

#### Anntena
```html:RequestHeader[記事ページ]
GET [記事ページのURL]?utm_source=antenna_sp HTTP/1.1
Host: [記事ページのURL]
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja-jp
Connection: keep-alive
X-Antenna-Instance: api4.antenna.jp
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

```html:RequestHeader[広告]
GET [広告のURL] HTTP/1.1
Host: [広告のURL]
Referer: [記事ページのURL]?utm_source=antenna_sp
Proxy-Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: ja-jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411
```

　__各アプリの通信内容を調査した結果、アプリ間でいくつかの違いを発見した。__

<dl>
<dt>広告のReferer</dt>
<dd>Facebook/Gunosy/SmartNewsは、広告のRefererが記事のURLになっていた。
NewsPicksは、リファラに[?ref=newspicks]のパラメータが付与されていた。
Anntenaは、リファラに[?utm_source=antenna_sp]のパラメータが付与されていた。</dd>
<dt>User-Agent</dt>
<dd>FacebookのUser-Agentには、独自の値が付与されていた。
他アプリのUser-Agentはどれも一緒で、デフォルト値が設定されていた。</dd>
</dl>

## 考察
もう一度調査目的を思い出す。
>Facebookアプリから開いた記事ページ内にFacebookの広告が表示されるような広告配信を防ぐことはできないのか。また、防げるとすればどうすればいいのかを把握するため。

調査結果より特定のアプリに関しては、防げることがわかった。

- Facebook
独自に付与しているUser-agentの値`[FBAN/FBIOS;FBAV/17.0.0.14.13;FBBV/4950859;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.1;FBSS/2; FBCR/`を識別子として利用する事でFacebookアプリからの流入を確認することができる。

- NewsPicks/Anntena
おそらく記事表示時にパラメータとして`?ref=newspicks`を付けるなどNewsPicks側と1次メディア側で記事を提供する際のルールを決めていると思われる。NewsPicks側で何らかのAPIを1次メディアに提供していると仮定すると、これを利用することでNewsPicksからの流入を確認することができる。Anntenaに関してもほぼ同様だと思われる。

- Gunosy/SmartNews
今回調べた限りだと識別することが難しい。あえて対応する方法としては、記事ページのRefererがGunosy/SmartNewsのURLになっているため、記事ページ側の処理でこれを引き回すことで流入を確認することができる。

## 個人的な考え
最近スマートデバイスからWebページを見る際にsafariやChromeを利用せずに、今回調査したようなアプリからWebページを見る事が多くなっていると思う。調査目的のような事象は、エンドユーザー、アプリ提供者、1次メディア、広告配信事業者、誰にとっても喜ばしいことではないし、今後このような事象を防ぐ必要があると思う。

個人的には、アプリ提供者側で対応を行ってほしく、具体的には、FacebookのようにUser-agent内に独自識別子を入れるような対応が一番好ましいと思う。理由としては、アプリ側の改修が軽微であることと、1次メディア側で対応しやすいからだ。記事クリックの実績などを1次メディア側と連携する場合は、API提供の方がいいが、今回の調査目的を達成するためだけだと、User-agentでの対応がもっとも適していると思う。

## 補足
- [iOS8]saferiのリファラ
Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4

- [iOS8]Chromeのリファラ
Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.67 Mobile/12B411

調査対象のアプリは、User-agentの値にデフォルト値が含まれているので、かなり辛いと思われるが、それと通常ブラウザの際から調査しても流入元を確認できるかもしれない。