Programing

PhoneGap / Cordova에서 쿠키 처리

lottogame 2020. 9. 19. 11:51
반응형

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'에 설정된 쿠키 유지됩니다.

The way to thus get a cookie to persist is to use the inAppBrowser plugin.

First, setup a simple server that accepts as GET parameter key-value parameters you want to persist. I'm a python/tornado guy, so my server might look like:

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

Then, in your app:

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);    
    });
}

You can then call this as follows:

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

You can also append the session id to the requesting url and depending on the server application language, fetch session data using the query string session id value you passed - example in PHP you can open an existing session by passing in the session id. While this is not recommended due to risks of session hijacking you can easily test for the IP and Browser to make sure the session is coming from the same client. This would of course require you expire your session as soon as the client closes the session browser and would limit you from caching views since the session would be included in the actual html. Storing data on the local device for me at least is not really an option as it exposes too much to the client which is in my opinion a far greater security risk.


Use the device_id to address certain records on server side. Create a database table named session on your server with device_id, cookiename, cookievalue and timestamp as columns.

When a client accesses your web server via phonegap app, get his device_id and store the cookies in your table. The device_id here acts as the access token in OAuth protocol.

Now for security reasons you need to reduce the validity period of those records, because the device_id is permenant and your client would want to sell their phones one day. Therefore, use timestamp to store the last access by the client, and delete the record if it has not been accessed for, say 10 days.


I am using Cordova 6.1 (newest version at the moment) and actually I found the following:

If I set the cookie via Javascript using document.cookie = ... then it does not work. However if I send a function setCookie via Ajax to the server with a function like

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=/"; 
    }
} 

and set the cookie on the server side using

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

then it does actually work!

Hope this helps. Cheers


Had the same problem, and decided to move evrth to localStorage I wrote plugin so you can use it also: angular-cookies-mirror


of course You can.

ionic app just send a ajax requset,cookie work good or not depend on server.

i have work with python Django server and node server,both cookie worked very well

node code below

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();
});

rest 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))
});

ionic app code

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)
  });
}

you can check my sourse code here


I think the question is fundamentally about setting client side cookies for a cordova app. Most information on this topic implies that setting client side cookies does not work for cordova.

But I found a plugin that allows me to set client side cookies for my cordova app.

Check out https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master.

It just works!


I also had session cookie issues with Cordova + XHR requests. The cookies are lost on every app restart. Two things have solved my issues:

  1. Cookies must have an expiration date.

  2. All XHR requests must have withCredentials flag set to true.

참고URL : https://stackoverflow.com/questions/15349237/handling-cookies-in-phonegap-cordova

반응형