2016년 3월 15일 화요일

Android app WebView 의 local html file 에서 CORS(Cross-Origin Resource Sharing) 문제 해결하기

CORS 는 다른 도메인에서 요청을 보내는 것을 말한다. 자세한 내용은 검색하면 무슨 의미인지 금방 알 수 있을 것이다. 정보도 많고... 여튼, 이 요청에 대한 spec에 따라

App REST api 요청을 보낼때 (WebView html 통하여)
http request header 에 내가 누군지 (origin 이라는 항목에 내용을 http://www.google.com 같은 url 정보로 채우도록) 를 적게 되어있다. 이 정보는 WebView (정확히는 Android Web engine) 이 자동으로 적어준다.

위와 같은 정보를 적어서 보내면 server 에서 http request header 를 열어서 origin 을 확인하고 해당 요청을 허용해 줄 지 말지 결정한다.

그래서 일단 sever (Django) 에 작업을 해야했다.

우선 server 설정을 모든 origin 에 대하여 통과하도록 해두었다. 
(https://github.com/ottoyiu/django-cors-headers 을 이용)

그런데 특정 핸드폰에서는 origin 을 null 로 setting 해서 보낸다.
server 에 origin null 이 들어오면 설정이고 뭐고 그냥 error 가 return 된다.
(local html 파일에서의 요청 경우에 origin 설정에 대한 spec 이 없기 때문이다.)

그래서 명시적으로 WebView 설정을 해주어야 안전하다.

webSettings.setAllowFileAccess(true);
webSettings.setAllowContentAccess(true);
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
이렇게 해주면 local html 에서의 CORS 요청에도 origin 값을 설정해서 보내게 되어 어느 폰에서나 정상적인 처리가 가능하다.
(모든 폰을 다 해보지 못했으나, 안되던 기기에서 저 설정 후 되는 것을 확인했다.)


댓글 없음:

댓글 쓰기