질문/조언질답게시판

코인빗,코인원 두군데 다 아래 메시지로 결과를 받아오지 못하는데요.

나오믄 메시지로 검색해봐도 이해가 쉽지 않네요.

 

ajax 요청에 무언가를 추가해서 해결할 수 있는 문제일까요?

 

 

Access to XMLHttpRequest at 'https://api.coinone.co.kr/ticker?currency=all&_=1621844305337' from origin 'https://rxtip.kr' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
jquery-2.2.4.min.js?20201218195938:4 GET https://api.coino

  • profile
    CORS 오류는 해당 사이트 정책상 AJAX로 불러오는 것이 금지되어 있다는 뜻이므로, 서버단에서 불러오는 방법으로 구현하지 않으면 해결할 수 없습니다.
  • profile profile
    ajax jsonp 로 해결이 된다는 문서도 있는데 읽어도 적용을 못하겠네요.
  • profile profile

    JSONP도 유저가 임의로 쓸 수 있는 것이 아니고, 서비스 제공자 측에서 지원해야 쓸 수 있습니다. 해당 거래소에서 JSONP를 지원하는지는 모르겠네요. 만약 지원한다면 매뉴얼에 나오겠지요.

  • profile
    프록시 서버를 활용해서 우회를 할 수도 있긴 한데 딜레이 타임이 약간 있기도 하고, jsonp 제공이 안 된다면 역시 서버단에서 origin 맞춰주는 게 제일 안정적이고 깔끔하긴 하더라구요.
  • profile profile
    저희 서버단에서 할 수 있나요? nginx 인데 어떻게 맞추는지 좀 알수 있을까요?
  • profile profile
    저는 서알못이라...

    위젯이나 애드온에서 js로 시작해서 접근하려면,
    아마도 php 파일을 하나 만들어서 그쪽으로 url과 파라미터를 넘기고,
    해당 php 파일에서 header 값을 추가해주고 json 데이터를 받은 뒤 다시 ajax쪽으로 리턴하는 것으로요.

    예전에 링크 파싱 애드온을 그런 식으로 만들었던 기억이 있어요.
  • profile profile
    <?php echo file_get_contents('https://api.coinone.co.kr/ticker?currency=all'); ?>

    이렇게 파일 하나 만들어 놓고 그 파일을 요청하시면 될 거예요.
    단, 서버 부하는 책임 못 집니다. 캐시를 적당히 활용한다면 훨씬 더 효율적이겠지요.
  • profile profile
    엥.. file_get_contents 만으로도 header 조작 안 해도 되는 거예요?
  • profile profile

    일단 비슷한 proxy 파일 하나 구해서 방금 데이터는 가져오게 했습니다.
    이게 저희 서버로 가져와서 결국 php로 가져오는 것이랑 비슷한 결과가 되는가 보네요.

     

     

    <?php
    $url = (isset($_GET['url'])) ? $_GET['url'] : false;
    if(!$url) exit;

    $referer = (isset($_SERVER['HTTP_REFERER'])) ? strtolower($_SERVER['HTTP_REFERER']) : false;
    $is_allowed = $referer && strpos($referer, strtolower($_SERVER['SERVER_NAME'])) !== false;

    $string = ($is_allowed) ? utf8_encode(file_get_contents($url)) : 'You are not allowed to use this proxy!';
    $json = json_encode($string);
    $callback = (isset($_GET['callback'])) ? $_GET['callback'] : false;
    if($callback){
        $jsonp = "$callback($json)";
        header('Content-Type: application/javascript');
        echo $jsonp;
        exit;
    }
    echo $json;
    ?>

     

     

    요런 파일이네요.

  • profile profile
    내 서버에서 직접 요청할 때는 브라우저의 보안정책에 전혀 영향을 받지 않지요.
  • profile profile
    그동안 제가 뭔가 잘못 생각하고 있었던 게 있나 봅니다.
    어떤 깨달음이 올랑말랑하는 게ㅋ 다시 한번 들여다봐야겠어요 ㅎㅎ
  • profile profile

    js 에서 proxy 를 사용했더니 위젯 캐시가 안먹는 문제가 있네요..
    캐시를 적용할 방법을 찾아봐야겠습니다.

     

    그냥 위젯 php 에서 불러오는 것으로 바꿔야 하는게 맞을 듯 하구요.

  • profile profile

    proxy 에서
    <?php echo file_get_contents('https://api.coinone.co.kr/ticker?currency=all'); ?>

    위 코드 파일 만들어서 변경했습니다.
    나중에 이 여기에 캐시를 적용할 수 있는지 연구해봐야겠습니다.

    예전에 코로나19 정보 데이터 캐시로 저장했는데 같은 방식일 것 같긴 합니다.

  • profile
    크롬 버전 올라가면서 (90) 되면서 좀더 엄격해진듯 하네요
    원래 빗썸인가 제외하고는 코인원은 가능했던 부분이라