Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

GAE/JでHTTPSの利用を強制するときの注意点とTips

Google App EngineではHTTPSを使うことができます。また、web.xmlにsecurity-constraintを記述することによって、HTTPSの利用を強制することもできます。
設定方法については公式サイトに載っているのですが、HTTPSの強制をCronTask Queueと併用する場合に1点注意する必要があります。


これらのサービスはサーブレットにHTTPでアクセスするため、対象がHTTPSの利用を強制されている場合に403 Forbiddenで返されてしまうのです。このためCronやTask Queueから使うサーブレットについてはHTTPSを強制せず、HTTPの許可を保つ必要があります。


とは言え「CronやTask Queueで使わないURLをピックアップして、それ以外をsecurity-constraintに登録」というのは面倒で漏れも出そうです。楽できないかなーと思っていたところ、/*に対して

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

を指定した後で、Cron用のURLに対して

<transport-guarantee>NONE</transport-guarantee>

を指定することでCronやTask Queueで叩くものだけHTTPSの強制対象から除くことができるとわかりました。イメージは以下のとおりです。

<security-constraint>
	<web-resource-collection>
		<url-pattern>/*</url-pattern>
	</web-resource-collection>
	<user-data-constraint>
		<transport-guarantee>CONFIDENTIAL</transport-guarantee>
	</user-data-constraint>
</security-constraint>
<security-constraint>
	<web-resource-collection>
		<url-pattern>/_ah/sessioncleanup</url-pattern>
	</web-resource-collection>
	<user-data-constraint>
		<transport-guarantee>NONE</transport-guarantee>
	</user-data-constraint>
</security-constraint>

この方法だとHTTPSを使うべきURLを指定から漏らしてしまう可能性をかなり減らせるのではないでしょうか。おすすめです。