rest api 호출시 cros 도메인 문제 발생..
본문
카페24 호스팅 받고있습니다 -php
Access to XMLHttpRequest at '~~~api서버 주소~~~' from origin '~~호출서버~~
' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
두 도메인 맞지않아 나오는 에러라
header("Access-Control-Allow-Origin: *");
처리를 했습니다. ( 메소드나 , 기타 다른 헤더설정도 해봄)
계속 위와 같은 오류로 접근할수 없게 되는데 아래와 같은 테스트를 해보니
+ 호출서버 방식
-------- 게시내용과 같은 오류 (크로스도메인문제로 접근안됨) -------
$.ajax({
url: '~~~api서버 주소~~~',
type: 'POST',
data: {'mb_id': 'test', 'mb_pw': '1234'},
headers: {'Content-Type': 'application/json'},
contentType:"application/json;charset=UTF-8",
error: function(){
alert("에러");
},
success: function(response) {
alert(response);
//var r=JSON.parse(response);
//$("#main").html(r.status);
$("#main").html(response);
}
});
----------- 크로스도메인임에도 접근이 되는 방식------------------
$.ajax({
url: '~~~api서버 주소~~~',
type: 'POST',
data:$("#frm").serialize() ,
contentType:"application/x-www-form-urlencoded;charset=UTF-8",
dataType: 'html',
error: function(){
alert("에러");
},
success: function(response) {
//var r=JSON.parse(response);
//$("#main").html(r.status);
$("#main").html(response);
}
});
위 소스로 테스트 결과
headers: {'Content-Type': 'application/json'},
contentType:"application/json;charset=UTF-8",
이부분 때문에 크로스도메인에 걸리는걸 확인했습니다.
rest api 대문에 json 형식으로 통신을 해야하는데
이와 비슷한 경험 하신 분 있으면 꼭 좀 답변 부탁드립니다.
답변 6
테스트를 위한 코드이고.. 실제로는 앱에서 호출될때 json 방식으로 호출이 옵니다..
그래서 api서버쪽 (웹) 쪽만 가지고 핸들링 해야합니다..
=> 앱에서 호출하시면 저 문제 없을텐데요
=> 앱에서는 도메인 제한이 없어서 크로스도메인 문제는 없어보이네요.
<VirtualHost *:80>
DocumentRoot "경로"
ServerName 도메인
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</VirtualHost>
=> 저동 동일한 문제가 발생한적이 있었던거 같은데 아파치 세팅에 설정하니
=> 서로 다른 도메인에서 호출이 가능했던거 같습니다.
=> 페이지에서 저도 이것저것 해봤는데 잘 안되었던거 같습니다.
Content-Type헤더에 허용되는 유일한 값은 다음과 같습니다.
* application/x-www-form-urlencoded
* multipart/form-data
* text/plain
출처 : https://uiandwe.tistory.com/1244
검색 결과 위방식만 크로스도메인에 허용되는 방식이라네요.
그럼 json 방식은 어떻게 허용되게 할까요?
php 문제가 아니라 javasciprt의 문제라서 브라우저에서 막는거라면 별다른 방법이 없을거예요
ajax 로 호출하지 않고 php 로 직접 주소를 호출하면 잘 되실겁니다.
내 도메인 php로 상대방 호출하는 페이지를 만드시고 그페이지를 ajax 로 호출하면 되실거 같네요.
jsonp로 타도메인으로 데이터를 ajax로 전달하면 상관없이 전달됩니다.
서버제로님
앱에서 호출하면 크로스도메인 문제가 없다는게 확실하다면 ...
개발테스트는 크롬으로 하고.. 크롬브라우져 설정에 "크로스도메인 무시하는 설정" 을
넣어서 개발진행 해도 무방할꺼같다는 생각이 드네요.
이 방법 괜찮은건지.. 다른분은 api 만들때 어떻게 작업하시는지..
=> 웹에서 테스트해서 작동잘한다고 앱에서 잘 된다는 보장이 없기 때문에
=> 안드로이드 스튜디오에서 호출부분만 만들어서 테스트합니다.