[cordova] PhoneGap / Cordova에서 쿠키 처리

서버 세션 사용으로 PhoneGap 앱에서 작업 중입니다. 세션을 처리하려면 쿠키가 필요합니다. 또한로드 밸런서의 쿠키도 처리해야합니다. 그래서 주위에 방법이 없습니다. PhoneGap 앱에서 쿠키를 어떻게 처리합니까?

나는 이미 몇 가지 연구를 수행했습니다.

  • 일부는 쿠키 처리가 알 수없는 사용자 에이전트 (IIS)에 대한 쿠키를 설정하지 않는 서버에 따라 달라질 수 있다고 말합니다 . iOS의 PhoneGap 세션 (쿠키)
  • JavaScript에서 쿠키는 document.cookie = …로 설정할 수 있지만 PhoneGap에 저장되지 않고 손실됩니다. xhr 요청을 실행하기 전에 작동합니다.
  • 쿠키는 xhr.getResponseHeader ( ‘Set-Cookie’)를 사용하여 xhr 요청 후에 검색 할 수 있습니다. 그러나 실제로 서버에 설정된 경우에만. 불행히도 jQuery는 “Cookie”헤더를 제거합니다.
  • JavaScript document.cookie 속성이 할당되지 않고 (xhr) 요청 후에 업데이트되지 않습니다.
  • 일부는 세션 ID 등을 저장하기 위해 localStorage를 제안합니다. 그러나 모든 스크립트가 이에 액세스 할 수 있으며 이는 XSS 보안 문제 일 수 있습니다. 쿠키는 httponly 플래그를 사용하여이 문제를 해결합니다.
  • iOS : 쿠키를 지원하기 위해 webView 동작을 변경하는 몇 가지 수정 사항이 있습니다. 하지만 iOS 6 및 PhoneGap 2.5에서는 작동하지 않는 것 같습니다. https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • 쿠키는 AppDelegate.m (v2.5)에서 기본적으로 활성화되어있는 것 같습니다.



답변

친구, 저도 폰갭과 함께 쿠키를 사용하는 데 성공하지 못했습니다. 해결책은 localStorage를 사용하는 것입니다.

주요 빠른 예 :

 var keyName = window.localStorage.key(0);

세트 항목 빠른 예 :

 window.localStorage.setItem("key", "value");

항목 빠른 예보기

 var value = window.localStorage.getItem("key");
 // value is now equal to "value"

항목 제거 빠른 예 :

 window.localStorage.removeItem("key");

명확한 빠른 예 :

 window.localStorage.clear();

모바일과 웹 모두에 자바 스크립트를 사용하는 경우이 코드를 사용하여 해당 환경을 감지 할 수 있습니다.

var wl = window.location.href;
var mob = (wl.indexOf("android")>0);

참조 :
http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html#localStorage
http://cordova.apache.org/docs/en/6.x/cordova/storage/storage.html # page-toc-source

주의 : iOS에서 익명 탐색을 사용하면 localstorage가 사양대로 작동하지 않을 수 있습니다. 나에게 잘 작동하는 간단한 테스트 :

$(document).ready(function () {
    try {
        localStorage.setItem('test', '1');
    } catch (Err) {
        if (Err.message.indexOf('QuotaExceededError') > -1) {
            // Tell the user they are in anonymous mode
            // Sugest it to go to https://support.apple.com/pt-br/HT203036 to get help to disable it
            }
        }
    }
});


답변

귀하와 마찬가지로 내 앱이 웹과 일치하고 별도의 장치 ID 또는 기타 인증 방법이 필요하지 않도록 내 애플리케이션 내 서버에서 설정 한 쿠키를 사용하고 싶었습니다.

내가 발견 한 것은 다음과 같습니다.

  • AJAX (예 : jQuery $.get()또는 $.post()) 를 통해 설정된 쿠키 는 지속되지 않습니다.
  • ‘inAppBrowser’에 설정된 쿠키 유지됩니다.

따라서 쿠키를 유지하는 방법은 inAppBrowser 플러그인 을 사용하는 입니다.

먼저, 유지하려는 GET 매개 변수 키-값 매개 변수로 허용하는 간단한 서버를 설정하십시오. 나는 python / tornado 사람이므로 내 서버는 다음과 같이 보일 수 있습니다.

class PersistCookieHandler(tornado.web.RequestHandler):
   @tornado.gen.coroutine
   def get(self):
      token = self.get_argument('token')
      self.set_secure_cookie('token',token)

그런 다음 앱에서 :

function persistToken(token,success_cb, error_cb) {
    // replace with your URL
    url = 'SECURE_SERVER_URL_THAT_HANDLES_SET_COOKIE';

    // _blank tells inAppBrowser to load in background (e.g., invisible)
    var ref = window.open(url, '_blank', 'location=no,toolbar=no');

    // attach a listener to the window which closes it when complete
    ref.addEventListener('loadstop', function(event) {
        ref.close();
        success_cb();  // call our success callback
    });

    // attach a listener for server errors
    ref.addEventListener('loaderror', function(event) {
        // call our error callback
        error_cb(event);
    });
}

그런 다음이를 다음과 같이 호출 할 수 있습니다.

persistToken(
   someToken,
   function() {
       console.log("token persisted");
   },
   function() {
       console.log("something went wrong);
   }
);


답변

요청 URL에 세션 ID를 추가하고 서버 애플리케이션 언어에 따라 전달한 쿼리 문자열 세션 ID 값을 사용하여 세션 데이터를 가져올 수도 있습니다. 예를 들어 PHP에서는 세션 ID를 전달하여 기존 세션을 열 수 있습니다. 세션 하이재킹의 위험으로 인해 권장되지는 않지만 IP와 브라우저를 쉽게 테스트하여 세션이 동일한 클라이언트에서 오는지 확인할 수 있습니다. 물론 클라이언트가 세션 브라우저를 닫 자마자 세션을 만료해야하며 세션이 실제 HTML에 포함되므로 뷰 캐싱에서 제한됩니다. 적어도 나를 위해 로컬 장치에 데이터를 저장하는 것은 제 생각에 훨씬 더 큰 보안 위험이있는 클라이언트에 너무 많이 노출되기 때문에 실제로 옵션이 아닙니다.


답변

device_id서버 측의 특정 레코드를 처리 하려면을 사용하십시오 . 라는 데이터베이스 테이블을 생성 session하여 서버에 device_id, cookiename, cookievaluetimestamp열로을.

클라이언트가 phonegap 앱을 통해 웹 서버에 액세스하면 클라이언트를 가져 와서 device_id테이블에 쿠키를 저장합니다. 는 device_id hereOAuth를 프로토콜에 액세스 토큰 역할을합니다.

이제 보안상의 이유로 해당 레코드의 유효 기간을 줄여야합니다. device_id가 영구적이고 고객이 언젠가 휴대폰을 판매하기를 원하기 때문입니다. 따라서 timestamp클라이언트의 마지막 액세스를 저장하는 데 사용 하고 10 일 동안 액세스하지 않은 경우 레코드를 삭제합니다.


답변

Cordova 6.1 (현재 최신 버전)을 사용하고 있으며 실제로 다음을 발견했습니다.

document.cookie = …를 사용하여 Javascript를 통해 쿠키를 설정하면 작동하지 않습니다. 그러나 Ajax를 통해 setCookie 함수를 서버에 다음과 같은 기능으로 보내면

function setCookie(name, value, exdays) {

    if(isPhonegap() === true){
        var data = "typ=function&functionType=setCookie&name="+name+"&value="+value+"&exdays="+exdays;
        loadAjax(data, false);
    }
    else if (!(document.cookie.indexOf("name") >= 0)){
            var expires;
            if (exdays) {
                var date = new Date();
                date.setTime(date.getTime()+(exdays*24*60*60*1000));
                expires = "; expires="+date.toGMTString();
            }
            else{
                expires = "";
            }
            document.cookie = name+"="+value+expires+"; path=/";
    }
}

다음을 사용하여 서버 측에 쿠키를 설정합니다.

setcookie($cookie, $value, $expires , "/" );

그러면 실제로 작동합니다!

도움이 되었기를 바랍니다. 건배


답변

동일한 문제가 있고, 로컬 스토리지 난 당신이 또한 그것을 사용할 수 있도록 플러그인 작성에 이동 evrth하기로 결정 : 각-쿠키 미러


답변

물론 당신은 할 수.

ionic 앱은 ajax requset을 보내면 쿠키가 잘 작동하거나 서버에 의존하지 않습니다.

나는 파이썬 Django 서버와 노드 서버와 함께 일했고, 둘 다 쿠키가 아주 잘 작동했습니다.

아래 노드 코드

app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("Access-Control-Allow-Credentials",true);
next();
});

나머지 API

router.get('/setCookies', function(req, res, next) {
var now = new Date();
var nextYear=new Date(now.setFullYear(now.getFullYear()+1));
//you can change the cookie key and value by your self here
res.cookie('cookiesTest', 'set cookies success,your cookies can be set by server', { expires: nextYear, httpOnly: true });
res.status(200)
res.end('SET COOKIES SUCCESS')
});

router.get('/getCookies', function(req, res, next) {
res.status(200)
res.end(JSON.stringify(req.cookies))
});

이온 앱 코드

var server='http://[YOUR IP HERE]:3000'

$scope.setCookies=function() {
  $http({
    url: server + '/setCookies',
    method: 'GET'
  }).success(function (data, header, config, status) {
    alert('set cookies success,look console')
    $scope.setCookiesStatu=false
    console.log(data)
    $scope.cookiesValue=data
  }).error(function (data, header, config, status) {
    alert('set cookies error,check console or your server address is wrong')
    console.log(data)
  });
}

$scope.getCookies=function() {
  $http({
    url: server + '/getCookies',
    method: 'GET'
  }).success(function (data, header, config, status) {
    alert('get cookies success,look console')
    console.log(data)
    $scope.cookiesValue=data
  }).error(function (data, header, config, status) {
    alert('get cookies error,check console or your server address is wrong')
    console.log(data)
  });
}

여기에서 내 소스 코드를 확인할 수 있습니다.