PhoneGap / Cordova에서 쿠키 처리


88

서버 세션 사용으로 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에 액세스 할 수 있다는 것은 무슨 뜻입니까? 각 PhoneGap 앱에 대해 별도의 샌드 박스라고 생각했습니다.
jayarjo


이 플러그인이 도움이 될까요? github.com/assembly/cordova-cookie-jar
J 크리스

답변:


68

친구, 저도 폰갭과 함께 쿠키를 사용하는 데 성공하지 못했습니다. 해결책은 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
            }
        }
    }
});

1
Tiago, 답변과 관련하여 앱이 제거 될 때까지 localStorage 옵션이 지속되는지 (데이터 손실이 발생하지 않음) 명확히 해주시겠습니까? 또한 다른 앱이 내 앱에서 설정 한 키-값 쌍에 도달 할 수 없다는 것이 확실하다고 말할 수 있습니까?
shamaleyte

2
@shamaleyte "LocalStorage는 쿠키가 아닌 캐시처럼 작동합니다. 각각의 지속성은 사용자의 브라우저 설정에 따라 달라지며 브라우저 자체가이를 구현하는 방법 (사양이 없기 때문에)" stackoverflow.com/questions/9948284/…
Tiago Gouvêa 2015

Cordova에서 localstorage를 사용하지 마십시오! iOS에서 시스템 프로세스는 마음대로 localstorage를 플러시 할 수 있습니다. gonehybrid.com/...
니코 Westerdale

4

귀하와 마찬가지로 내 앱이 웹과 일치하고 별도의 장치 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);
   }
);

3

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


$.post()jQuery에서 사용 하는 것과 같은 포스트 XmtHttpRequest를 통해 보낸 다음 로컬 변수를 설정할 수도 있습니다. 모든 것을 암호화하면 매우 안전합니다.
JVE999

@ JVE999 웹보기에서 기본적으로 저장되는 쿠키를 암호화하는 방법은 무엇입니까?
LoveForDroid

3

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

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

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


3

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 , "/" );

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

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


0

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


0

물론 당신은 할 수.

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

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


0

질문은 근본적으로 코르도바 앱에 대한 클라이언트 측 쿠키 설정에 관한 것이라고 생각합니다. 이 주제에 대한 대부분의 정보는 클라이언트 측 쿠키 설정이 Cordova에서 작동하지 않음을 의미합니다.

하지만 Cordova 앱에 클라이언트 측 쿠키를 설정할 수있는 플러그인을 찾았습니다.

https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master를 확인 하십시오 .

그냥 작동합니다!


0

Cordova + XHR 요청에 세션 쿠키 문제도있었습니다. 앱을 다시 시작할 때마다 쿠키가 손실됩니다. 두 가지가 내 문제를 해결했습니다.

  1. 쿠키에는 만료일이 있어야합니다.

  2. 모든 XHR 요청에는 withCredentials 플래그가 true로 설정되어 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.