쿠키 비활성화 여부를 서버 측에서 감지하는 방법


91

브라우저의 쿠키가 비활성화되었는지 여부를 서버 (서버 측)에서 어떻게 감지 할 수 있습니까? 가능할까요?

자세한 설명 : 서버에서 HTTP 요청을 처리하고 있습니다. Set-Cookie헤더 를 통해 쿠키를 설정하고 싶습니다 . 그때 나는 쿠키가 클라이언트 브라우저에 의해 설정 될 것인지 아니면 쿠키 설정 요청이 무시 될 것인지 알아야합니다.


어디? 브라우저 (클라이언트 측)에서? 아니면 서버에서? (어떤 서버)
Assaf Lavie

7
서버 측 코드에서 DETECT 쿠키 활성화 / 비활성화, 예.
Assaf Lavie

자바 스크립트 대신 동적 언어를 사용한다는 뜻입니다. 쿠키는 항상 클라이언트 브라우저에 추가되므로 서버가 없습니다!
balexandre

답변:


58

쿠키 세트와 함께 리디렉션 응답을 보냅니다. 쿠키에 대한 (특수) 리디렉션 된 URL 테스트를 처리 할 때-쿠키가 있으면 일반 처리로 리디렉션하고, 그렇지 않으면 오류 상태로 리디렉션합니다.

이는 브라우저가 쿠키 설정을 허용 한 시간 만 알려주는 것이 아니라 얼마나 오래 지속되었는지를 알려줄 수 있습니다. My FF를 사용하면 사이트가 예외 목록에 특별히 추가되지 않는 한 모든 쿠키를 "세션"모드로 강제 설정할 수 있습니다. 이러한 쿠키는 FF가 지정된 서버 만료에 관계없이 종료 될 때 삭제됩니다. 그리고 이것이 제가 항상 FF를 실행하는 모드입니다.


14
stackoverflow를 제외하고?
Simon_Weaver

9
많은 사이트를 제외하고 그중 하나는 실제로 SO입니다.
Lawrence Dol

43

Javascript를 사용하여 수행 할 수 있습니다.

도서관:

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}

function areCookiesEnabled() {
    var r = false;
    createCookie("testing", "Hello", 1);
    if (readCookie("testing") != null) {
        r = true;
        eraseCookie("testing");
    }
    return r;
}

실행할 코드 :

alert(areCookiesEnabled());

생각해 내다

이것은 자바 스크립트가 활성화 된 경우에만 작동합니다!


23
문제는 서버 측에서 쿠키를 감지하는 방법에 관한 것입니다. 코드는 클라이언트 측에서 실행됩니다.
Adam

2
서버 측-그러나 그는 그가 사용하는 서버 언어를 지정하지 않았습니다! 하지만 트릭은 동일합니다 ... 쿠키를 작성하고 거기에 있는지 확인합니다 ...있는 경우 쿠키 활성화, 그렇지 않은 경우 비활성화 됨;)
balexandre

14
그가 서버에서 사용하는 언어는 중요하지 않습니다. 이 질문은 HTTP 요청 / 응답 측면에서 답할 수 있습니다.
Martijn

7
해당 자바 스크립트 코드는 브라우저에서 쿠키가 활성화되었는지 여부를 감지하기 위해 브라우저에서 실행되어야합니다. 서버 측에서 실행할 수 없습니다.
Marquis of Lorne

4
@Adam-OP가 서버 측에 대해 물었지만 사이트가 완전히 작동하려면 쿠키를 활성화해야 함을 사용자에게 알리려는 경우 클라이언트 측 쿠키 테스트가이를 달성 할 수 있습니다 (JavaScript가 활성화 된 경우).
크리스

18

직접 확인하는 방법은 없다고 생각합니다. 가장 좋은 방법은 쿠키에 값을 저장하고 값을 읽고 쿠키 사용 여부를 결정하는 것입니다.


16

쿠키 지원을 확인하는 일반적인 방법은 리디렉션을 사용하는 것입니다.

사용자가 로그인하거나 장바구니에 무언가를 추가하는 등 세션을 시작하는 작업을 시도 할 때만이 작업을 수행하는 것이 좋습니다. 그렇지 않으면 처리 방법에 따라 쿠키를 지원하지 않는 사용자 또는 봇에 대해 전체 사이트에 대한 액세스를 잠재적으로 차단하게됩니다.

먼저 서버는 로그인 데이터를 정상적으로 확인합니다. 로그인 데이터가 잘못된 경우 사용자는 해당 피드백을 정상적으로받습니다. 맞다면, 서버는 즉시 쿠키로 응답하고 해당 쿠키를 확인하도록 설계된 페이지로 리디렉션합니다.이 페이지는 동일한 URL 일 수 있지만 쿼리 문자열에 플래그가 추가됩니다. 두 번째 페이지가 쿠키를받지 못하면 사용자는 브라우저에서 쿠키가 비활성화되어 있기 때문에 로그인 할 수 없다는 메시지를받습니다.

로그인 양식에 대해 Post-Redirect-Get 패턴을 이미 따르고있는 경우이 설정 및 쿠키 확인은 추가 요청을 추가하지 않습니다. 쿠키는 기존 리디렉션 중에 설정 될 수 있으며로드되는 대상에서 확인할 수 있습니다. 리디렉션 후.

이제 모든 페이지로드가 아닌 사용자가 시작한 작업 후에 만 ​​쿠키 테스트를 수행하는 이유가 여기에 있습니다. 나는 사이트가 모든 단일 페이지에 쿠키 테스트를 구현하는 것을 보았지만 이것이 사이트를 크롤링하려는 검색 엔진과 같은 것에 영향을 미칠 것이라는 사실을 깨닫지 못했습니다. 즉, 사용자가 쿠키를 사용하도록 설정 한 경우 테스트 쿠키가 한 번 설정되므로 요청한 첫 번째 페이지에서만 리디렉션을 견뎌야하며 그 이후로는 리디렉션이 없습니다. 그러나 쿠키를 반환하지 않는 검색 엔진과 같은 브라우저 또는 기타 사용자 에이전트의 경우 모든 단일 페이지에서 단순히 리디렉션이 발생할 수 있습니다.

쿠키 지원을 확인하는 또 다른 방법은 자바 스크립트를 사용하는 것입니다.이 방법은 리디렉션이 필요하지 않습니다. 쿠키를 작성하고 사실상 즉시 다시 읽어서 저장 한 다음 검색했는지 확인할 수 있습니다. 이것의 단점은 클라이언트 측의 스크립트에서 실행 된다는 것입니다. 즉, 쿠키가 서버로 돌아 가기 위해 지원되는지 여부에 대한 메시지를 여전히 원한다면 Ajax 호출과 같이 여전히 구성해야합니다.

내 응용 프로그램의 경우 사용자가 로그인하기 전에 로그인 화면에 임의의 토큰이 포함 된 쿠키를 설정하고 사용자가 로그인을 제출할 때 해당 토큰을 확인하여 CSRF 공격의 변형 인 'Login CSRF'공격에 대한 일부 보호를 구현합니다. 세부. Google의 로그인 CSRF에 대해 자세히 알아보세요. 이것의 부작용은 그들이 로그인하는 순간 그 쿠키의 존재를 확인할 수 있다는 것입니다. 추가 리디렉션이 필요하지 않습니다.


5

일반적으로 사용자가 사이트에서 로그인 양식 제출, 장바구니에 항목 추가 등과 같은 조치를 취한 후에 만 ​​쿠키 지원을 확인하면됩니다.

저에게 현재 쿠키 지원 확인은 CSRF (Cross-Site Request Forgery) 방지와 밀접한 관련이 있습니다.

CSRF대해 더 많이 읽으려면 다른 곳으로 가야 하지만, 그 뒤에 숨겨진 아이디어는 다른 사이트가 속이거나 사용자가 선택한 숨겨진 양식을 자신의 사이트에 제출하도록 속일 수 있다는 것입니다. 이를 우회하는 방법은 뷰어가 양식을 볼 때 쿠키를 설정하고 일치하는 토큰을 숨겨진 양식 요소로 설정 한 다음 양식을 처리 할 때 쿠키와 숨겨진 양식 요소가 모두 설정되어 있고 서로 일치하는지 확인하는 것입니다. 시도 된 CSRF 공격 인 경우 사이트는 동일한 출처 정책에 따라 사용자의 쿠키를 읽을 수 없기 때문에 사용자의 쿠키와 일치하는 숨겨진 필드를 제공 할 수 없습니다.

쿠키가없는 양식이 제출되었지만 유효한 토큰이 포함 된 경우 사용자가 쿠키를 사용하지 않도록 설정하고 사용자가 쿠키를 사용하고 다시 시도해야한다는 메시지를 표시 할 수 있습니다. 물론 다른 가능성은 사용자가 시도 된 CSRF 공격의 피해자라는 것입니다. 따라서 쿠키가 일치하지 않을 때 사용자를 차단하면 해당 공격을 방지하는 부작용도 있습니다.


4

나는 항상 이것을 사용했습니다.

navigator.cookieEnabled

w3schools 에 따르면 "cookieEnabled 속성은 모든 주요 브라우저에서 지원됩니다."

그러나 이것은 양식을 사용할 때 작동하며 브라우저에 추가 정보를 보내도록 지시 할 수 있습니다.


나에게서 +1. 반대표에 대한 이유가 있습니까? 이것은 JavaScript에서 쿠키 차단을 감지하는 합리적인 방법으로 보입니다 (그리고 나를 위해 Chrome과 IE 모두에서 작동합니다).
Milan Gardian

6
나는 그 질문이 서버 측에서 지원을 감지하는 방법에 대해 구체적으로 물었 기 때문이라고 생각합니다. 이것은 클라이언트 측에서 지원을 테스트하는 가장 좋은 방법입니다.
TJ VanToll

3
W3Schools는 HTML / Javascript / CSS 등 의 신뢰할 수있는 소스아닙니다 . 정보.
BryanH 2013 년

5
이것은 브라우저가 지원하는 경우에만 테스트합니다. 활성화되어 있는지 테스트하지 않습니다. 사실상 모든 브라우저가이를 지원하므로 이것은 거의 쓸모가없는 것 같습니다. 죄송합니다.
StuckOnSimpleThings

3

쿠키에 무언가를 저장 한 다음 읽어보십시오. 예상 한 결과를 얻지 못하면 쿠키가 비활성화되었을 수 있습니다.


많은 웹 사이트에서이를 수행합니다. 첫 번째 요청 에서 쿠키가 활성화되었는지 확인하는 것은 서버에서 불가능 하지만이를 파악하기 위해 짧은 리디렉션 단계를 구현할 수 있습니다.
Tom Lianza

2

이 코드를 확인하면 도움이 될 것입니다.

<?php
session_start();

function visitor_is_enable_cookie() {
    $cn = 'cookie_is_enabled';
    if (isset($_COOKIE[$cn]))
        return true;
    elseif (isset($_SESSION[$cn]) && $_SESSION[$cn] === false)
        return false;

    // saving cookie ... and after it we have to redirect to get this
    setcookie($cn, '1');
    // redirect to get the cookie
    if(!isset($_GET['nocookie']))
        header("location: ".$_SERVER['REQUEST_URI'].'?nocookie') ;

    // cookie isn't availble
    $_SESSION[$cn] = false;
    return false;
}

var_dump(visitor_is_enable_cookie());

1

쿠키가 "활성화"되어 있는지 여부에 대한 질문은 너무 부울입니다. 내 브라우저 (Opera)에는 사이트 별 쿠키 설정이 있습니다. 또한 해당 설정은 예 / 아니요가 아닙니다. 가장 유용한 형식은 실제로 "세션 전용"이며 서버의 만료 날짜를 무시합니다. 설정 후 직접 테스트하면 거기에있을 것입니다. 내일은 그렇지 않습니다.

또한 변경할 수있는 설정이므로 쿠키가 남아 있는지 여부를 테스트해도 테스트 할 때 설정에 대해서만 알려줍니다 . 쿠키 하나를 수동으로 수락하기로 결정했을 수도 있습니다. 계속 스팸을 받으면 해당 사이트의 쿠키를 끌 수 있습니다 (때로는 그렇게 할 것입니다).


3
좋은 지적이지만 내 Set-Cookie 헤더가 동일한 클라이언트의 다음 요청이 해당 쿠키와 함께 제공되는지 여부를 알아야합니다. 영구적이거나 세션 전용인지는 나에게 중요하지 않습니다.
Alexander Yanovets

1

세션 쿠키 (세션 수명 동안 존재하는 쿠키)가 활성화되어 있는지 확인하려는 경우 web.config 파일에서 세션 모드를 AutoDetect 로 설정 하면 Asp.Net 프레임 워크가 클라이언트 브라우저에 쿠키를 작성합니다. AspxAutoDetectCookieSupport 라고 합니다 . 그런 다음 Request.Cookies 컬렉션에서이 쿠키를 찾아 클라이언트에서 세션 쿠키가 활성화되어 있는지 확인할 수 있습니다.

예 : web.config 파일 세트 :

<sessionState cookieless="AutoDetect" />

그런 다음 다음을 사용하여 클라이언트에서 쿠키가 활성화되었는지 확인합니다.

if (Request.Cookies["AspxAutoDetectCookieSupport"] != null)  { ... }

참고 : 기본적으로 이것은 UseDeviceProfile로 설정되어 있으며, 쿠키가 비활성화 된 경우에도 클라이언트가 지원 하는 한 클라이언트에 쿠키 쓰기를 시도합니다 . 이것은 일종의 무의미한 것처럼 보이므로 이것이 기본 옵션이라는 것이 약간 이상합니다. 세션은 UseDeviceProfile로 설정된 클라이언트 브라우저에서 비활성화 된 쿠키와 작동하지 않으며 쿠키를 지원하지 않는 클라이언트에 대해 쿠키없는 모드를 지원하는 경우 작동하지 않습니다. , 그런 다음 자동 감지를 사용하고이를 비활성화 한 클라이언트에 대해 쿠키없는 모드를 지원하지 않는 이유는 무엇입니까?


1
ASP.NET은 원래 질문은 중립적 인 기술이었다 가정
데이비드 Moorhouse

1

위의 "balexandre"의 대답을 훨씬 더 단순화 된 버전으로 사용하고 있습니다. 쿠키가 활성화되었는지 확인하기위한 목적으로 만 세션 쿠키를 설정하고 읽습니다. 예, JavaScript도 활성화해야합니다. 그래서 당신이 관심이 있다면 거기에 태그를 원할 수 있습니다.

<script>
// Cookie detection
document.cookie = "testing=cookies_enabled; path=/";
if(document.cookie.indexOf("testing=cookies_enabled") < 0)
{
    // however you want to handle if cookies are disabled
    alert("Cookies disabled");
}
</script>
<noscript>
    <!-- However you like handling your no JavaScript message -->
    <h1>This site requires JavaScript.</h1>
</noscript>

1

NodeJS-서버 측 -쿠키 검사 리디렉션 미들웨어-Express 세션 / 쿠키 파서

의존성

var express = require('express'),
    cookieParser = require('cookie-parser'),
    expressSession = require('express-session')

미들웨어

return (req, res, next) => {
  if(req.query.cookie && req.cookies.cookies_enabled)
    return res.redirect('https://yourdomain.io' + req.path)
  if(typeof(req.cookies.cookies_enabled) === 'undefined' && typeof(req.query.cookie) === 'undefined') {
    return res.cookie('cookies_enabled', true, {
      path: '/',
      domain: '.yourdomain.io',
      maxAge: 900000, 
      httpOnly: true,
      secure: process.env.NODE_ENV ? true : false
    }).redirect(req.url + '?cookie=1')
  }
  if(typeof(req.cookies.cookies_enabled) === 'undefined') {
    var target_page = 'https://yourdomain.io' + (req.url ? req.url : '')
    res.send('You must enable cookies to view this site.<br/>Once enabled, click <a href="' + target_page + '">here</a>.')
    res.end()
    return
  }
  next()
}

0

cookieEnabled속성은 브라우저에서 쿠키를 사용할 수 있는지 여부를 지정하는 부울 값을 반환합니다.

<script>
if (navigator.cookieEnabled) {
    // Cookies are enabled
}
else {
    // Cookies are disabled
}
</script>

OP는 서버 측에서 감지하는 방법을 알고 싶었습니다.
ZiggyTheHamster

당연히 애플리케이션에 적합한 방식으로 해당 정보를 서버로 다시 가져와야합니다. 브라우저와 상호 작용하지 않고는 브라우저에 쿠키가 활성화되어 있는지 여부를 확인할 수 없습니다.
Steve

-1

쿠키가 활성화 된 경우 navigator.CookieEnabled (false의 경우 true를 반환 함) 및 Html 태그 noscript를 사용합니다. 그건 그렇고 navigator.cookieEnabled는 자바 스크립트이므로 HTML로 입력하지 마십시오


1
문제는 클라이언트 측이 아닌 서버 측 검사에 관한 것입니다.
Evan M

-1
<?php   session_start();
if(SID!=null){
  echo "Please enable cookie";
}
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.