AJAX 요청은 PHP 세션 정보를 유지합니까?


154

사용자가 내 사이트에 로그인하여 아이디를 저장 $_SESSION하고 브라우저에서 '저장'버튼을 클릭하면 서버에 AJAX 요청이 발생합니다. 하나님의 뜻 $_SESSION과 쿠키는이 요청에 유지, 그리고 안전하게의 id 존재 존재에 의존 할 수 $_SESSION?

답변:


191

대답은 '예'입니다.

세션은 서버 측에서 유지 관리됩니다. 서버에 관한 한 AJAX 요청과 일반 페이지 요청 사이에는 차이가 없습니다. 둘 다 HTTP 요청이며 동일한 방식으로 헤더에 쿠키 정보를 포함합니다.

클라이언트 측에서 일반 쿠키이든 AJAX 요청이든 동일한 쿠키가 항상 서버로 전송됩니다. Javascript 코드는 특별한 작업을 수행하거나 이러한 상황을 인식 할 필요가 없으며 일반 요청과 동일하게 작동합니다.


10
후속 조치 : HttpOnly쿠키를 설정할 때 서버에서 플래그를 설정할 수 있습니다. 이는 Javascript가 쿠키를 볼 수 없음을 의미합니다. 그러나 쿠키 여전히 AJAX 및 일반 페이지 요청에 대해 전송되며 계속 동일하게 작동합니다. Javascript는에서 볼 수 없습니다 document.cookie.
thomasrutter

PHP 오류보고가 켜져 있으면 AJAX 응답과 함께 세션 오류가 리턴 될 수 있습니다. Warning: session_write_close(): Failed to write session data (user)프로젝트에서 최근에 간헐적으로 오류가 발생했지만 나머지 페이지를로드하는 동안 AJAX 요청이 발생할 때만 가능합니다. 세션 데이터에 MySQL DB를 사용하고 있으며 기본 페이지 요청이 해당 테이블을 잠 가서 AJAX 요청이 액세스하지 못하게 할 수 있습니다.
Buttle Butkus '

@ButtleButkus는 서버 측 코드의 문제처럼 들리며 사람들이 자신의 질문으로 제출하면 기꺼이 도움을 줄 것이라고 확신합니다. 세션에 MySQL을 사용하고 있기 때문에 오류가 발생하지 않아야합니다. 오류와 함께 실패하지 않는 방식으로 잠겨서는 안됩니다. MySQL 연결이 포화 상태이거나 다른 관련이없는 문제 일 수 있습니다.
thomasrutter '

방랑하는 기계에서 발생하므로 MySQL 연결이 포화 상태 여야합니다. 내가 곧 알아낼 수 없다면 확실히 질문을 게시 할 것입니다.
Buttle Butkus

23

PHP 파일에 AJAX 요청이 있으면 session_start()세션 정보가 유지됩니다. (요청이 동일한 도메인 내에 있음)


2
실제로, 그것은 내가 잊어 버린 것입니다 :-)
sivann

23

실제로 얻는 것은 쿠키가 AJAX 요청과 함께 전송됩니까? AJAX 요청이 동일한 도메인 (또는 쿠키의 도메인 제약 조건)에 있다고 가정하면 대답은 예입니다. 따라서 동일한 서버로 다시 AJAX 요청은 동일한 세션 정보를 유지합니다 (호출 된 스크립트가 세션 정보에 액세스하려는 다른 PHP 스크립트에 따라 session_start ()를 발행한다고 가정).


1
틀렸을 수도 있지만 다른 도메인에 아약스 요청을 게시하는 것이 불가능하다고 생각했습니다 (하위 도메인 제외)?
Emil H

동적 스크립트 트릭으로 속일 수 있습니다. 그래도 피곤하지 않습니다.
cletus 2016 년

1
예, 다른 도메인에는 아약스 요청을 할 수 없습니다. 그러나 <script> 태그를 페이지에 동적으로 삽입하고 src를 자바 스크립트를 반향하는 도메인 외부 URL로 설정할 수 있습니다.
Upvote를 클릭하십시오

1
다른 도메인에는 아약스 요청을 할 수 없습니다. 하지만 PHP 코드에서 프록시를 만들 수 있습니다. 프록시에 대한 ajax 요청, 다른 도메인에 대한 프록시 요청.
피터 롱

2
참고로 ... 아약스 요청은 도메인 간 응답이 가능하지만 응답 유형이 jsonp 인 경우에만 가능합니다. 나는 항상 이것을한다.
주현절

8

항상 그런 것은 아닙니다. 쿠키를 사용하면 좋습니다. 그러나 "현재 존재하는 ID에 안전하게 의존 할 수 있는가? " 는 중요한 점으로 논의를 확대 할 것을 촉구했다.

쿠키 대신 URL을 다시 작성하여 세션을 유지하도록 PHP를 구성 할 수 있습니다. ( 좋은 점과 나쁜 점 (<-예를 들어 맨 위의 주석 참조)은 별도의 질문입니다 . 이제 단 하나의 메모만으로 현재 질문을 고수합시다 : URL 기반 세션에서 가장 두드러진 문제-뻔뻔스러운 알몸 세션 ID의 가시성-내부 Ajax 호출의 문제는 아니지만 Ajax에 대해 켜져 있으면 나머지 사이트에서도 켜집니다.)

URL 재 작성 (쿠키리스) 세션의 경우 Ajax 호출은 요청 URL이 올바르게 작성되도록 스스로 처리해야합니다 . (또는 사용자 정의 솔루션을 롤링 할 수도 있습니다. 덜 까다로운 경우 클라이언트 측 에서 세션을 유지 관리하는 데 의존 할 수도 있습니다 .) 쿠키를 사용하지 않는 경우 세션 연속성에 필요한 명시적인 관리가 중요합니다.

  1. Ajax 호출 이 HTML에서 URL을 그대로 추출 하면 (PHP에서 수신 한대로) 이미 쿠킹 (umm, 쿠킹)되었으므로 괜찮습니다.

  2. 요청 URI 자체 를 어셈블 해야하는 경우 세션 ID를 URL에 수동으로 추가해야합니다. ( 여기 에서 또는 URL 재 작성 기능이있는 PHP로 생성 된 페이지 소스 를 확인하는 방법을 확인하십시오.)


에서 OWASP.org :

효과적으로, 웹 애플리케이션은 메커니즘, 쿠키 또는 URL 매개 변수를 모두 사용하거나 특정 조건이 충족되는 경우 (예 : 쿠키를 지원하지 않는 웹 클라이언트의 존재 또는 쿠키가 아닌 경우) 자동 전환 (자동 URL 재 작성) 사용자 개인 정보 보호 문제로 인해 허용됨).

A로부터 루비 포럼 게시물 :

쿠키와 함께 PHP를 사용하면 세션 ID가 Ajax XMLHttpRequests의 경우에도 요청 헤더로 자동 전송됩니다. URL 기반 PHP 세션을 사용하거나 허용하는 경우 모든 Ajax 요청 URL에 세션 ID를 추가해야합니다.


얼마나 많은 사람들이 세션 쿠키를 비활성화 했는지에 대한 신뢰할만한 통계가 있습니까? (아무것도 찾지 못했습니다. Javascript에서만 : 미국 / 유럽에서는 약 2 %, 세계 평균은 ~ 1.2 %입니다.)
Sz.

URL의 세션 ID는 오래되고 안전하지 않은 방법입니다. 오늘날의 웹에서는 쿠키를 사용하지 않고 서핑을하고 계정을 보유한 웹 사이트에 여전히 로그인 할 수 있다고 가정해서는 안됩니다. 방문자 중 한 명이 쿠키를 비활성화 한 경우 다음 중 하나를 가정하는 것이 안전합니다. a) 개인 정보 보호를 위해 특정 사이트에 로그인하지 않으려는 사용자; 또는 b) 실수로 해냈으므로 이제는 귀하의 사이트뿐만 아니라 어떤 사이트 에도 로그인 할 수 없습니다 .
thomasrutter

3

AJAX 요청은 세션을 유지하는 것이 매우 중요합니다. 가장 쉬운 예는 관리자 패널에 대해 AJAX 요청을 시도 할 때입니다. 물론 관리자 로그인 후 세션이없는 다른 사람이 액세스 할 수 없도록 요청한 페이지를 보호해야합니다. 말이된다?


0

그러나 특히 프레임 워크를 사용하는 경우 응용 프로그램이 요청간에 세션 ID를 재생성하는지 확인하는 것이 좋습니다. 세션 ID에 명시 적으로 의존하는 것은 문제가 발생할 수 있습니다. 세션은 영향을받지 않습니다.

애플리케이션이 이와 같은 세션 ID를 재생성하는 경우, 요청 페이지에서 ajax 요청이 실제로 세션 ID를 무효화 / 대체하는 상황이 발생할 수 있습니다.


0

예를 들어 Front Controller 또는 boostrap 스크립트에서 세션을 초기화하는 경우 페이지 컨트롤러 또는 ajax 컨트롤러에 대한 초기화에 신경 쓸 필요가 없습니다. PHP 프레임 워크는 만병 통치약은 아니지만 이와 같은 많은 유용한 기능을 수행합니다!


0

ajax 요청을 수락하는 모든 서버 사이드 페이지에 session () 인증을 넣으십시오.

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

그것은 내가 한 유일한 방법에 관한 것입니다.

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