크롬. 엣지, 웨일,파이어폭스,오페라의 웹브라우저와 모바일을 통한 안드로이드 사용시에는 프로그램이 정상적으로 잘 돌아갑니다.
하지만 아이폰에서만네트웤 손실로 safari가 제데로 작동을 안한다는 메세지가 뜨고 안되네요...
(아이패드는 안해봤구요)
프로그램에는 이상이 없는거 같은데요..
혹시 서버나 사파리 브라우저 문제 인가요?
경험하신 고수님 계시면 답변 부탁드려요...
답변 4개 / 댓글 3개
세션/쿠키 설정에서 SameSite 속성이나 보안 헤더가 iOS 정책과 충돌해서일 겁니다.
세션 쿠키 설정에 보안과 SameSite=None이 확연하게 지정되여야 합니다.
SameSite=None을 설정하지 않음 기본으로 다른 사이트 요청에서 쿠키가 차단됩니다.
특히 사파리와 최신 브라우저에서는 SameSite=Lax가 기본값이므로,
POST 요청이나 iframe 내부에서는 쿠키가 전송되지 않을 수 있습니다.
따라서, 외부 사이트에서 로그인 세션을 유지하거나,
API 연동, OAuth 로그인, 결제 시스템을 사용할 경우
SameSite=None을 설정하셔야 합니다.
그누보드5는 common.php를 통해 전역으로 세션/쿠키를 관리합니다.
그러나, 커스텀 페이지가 이를 포함하지 않는다면 사파리에서 쿠키가 차단되어
네트워크 손실 문제(로그인 유지 실패, 세션 끊김 등)가 발생할 수 있을 것입니다.
답변에 대한 댓글 3개
커스텀 페이지라도 common.php를 올바르게 삽입하기만 잘 하시면 되지 않나 싶습니다.
common.php 아래 코드를 보면
$headers = headers_list();
krsort($headers);
$cookie_session_name = method_exists('XenoPostToForm', 'g5_session_name') ? XenoPostToForm::g5_session_name() : 'PHPSESSID';
foreach ($headers as $header) {
if (!preg_match('~^Set-Cookie: '.$cookie_session_name.'=~', $header)) continue;
$header = preg_replace('~(; secure; HttpOnly)?$~', '; secure; HttpOnly; SameSite=None', $header);
header($header, false);
$g5['session_cookie_samesite'] = 'none';
break;
}
return $res;
=========================================
해당은 'none'을 단순히 'Lax'로 바꾸는 방식으로 적절하지 않습니다.
해당은 'none'이 필요한 특정 환경을 위한 필수적인 설정이며,
무조건 Lax로 변경하면 이런 기능이 제대로 작동하지 않게 됩니다.
>>> 기본적으로 원본 코드를 유지하시고,
아이폰/사파리에서의 문제를 별도의 조건으로 처리하는 방식이어야 할 겁니다.
※ 환경에 따른 분기 처리 예십니다.
if(!function_exists('session_start_samesite')) {
function session_start_samesite($options = array())
{
global $g5;
$res = @session_start($options);
$sameSite = 'None'; // 기본 SameSite 설정
// 아이폰 사파리, IE, Edge, HTTP 환경에서만 SameSite=Lax 설정으로 변경
if (isset($_SERVER['HTTP_USER_AGENT'])) {
if (preg_match('/Edge|MSIE|Trident/i', $_SERVER['HTTP_USER_AGENT']) ||
preg_match('/(iPhone|iPod|iPad).*AppleWebKit.*Safari/i', $_SERVER['HTTP_USER_AGENT']) ||
!(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on')) {
$sameSite = 'Lax';
}
}
$headers = headers_list();
krsort($headers);
$cookie_session_name = method_exists('XenoPostToForm', 'g5_session_name') ? XenoPostToForm::g5_session_name() : 'PHPSESSID';
foreach ($headers as $header) {
if (!preg_match('~^Set-Cookie: '.$cookie_session_name.'=~', $header)) continue;
$header = preg_replace('~(; secure; HttpOnly)?$~', '; secure; HttpOnly; SameSite='.$sameSite, $header);
header($header, false);
$g5['session_cookie_samesite'] = strtolower($sameSite);
break;
}
return $res;
}
}
보통 그런경우는 아이폰 내에 브라우저 커스텀이라던지 사파리 설정
그리고 폰트 강제 설정 등으로 원하는 결과가 안나올수 있습니다.
아이폰에 크롬 설치하셔서 테스트 해보세요.
프로그램은 새창으로 띄워서 단순한 저장 프로그램 입니다.
혹시 https:// 로 접속했는지 확인해 보세요..
사파리는 이 부분이 좀 민감 한것 같았습니다.
답변을 작성하려면 로그인이 필요합니다.
커스텀 페이지에서도 common.php는 포함되어 있습니다.
현재 common.php에서는 아래와 같이 설명해주고 있는데요.
ios를 사용하려면 samesite=Lax로 해줘야 되고
전자결제나 api를 사용하려면 samesite=none으로 해줘야 된다는 말씀이신가요?
[code]
if(!function_exists('session_start_samesite')) {
function session_start_samesite($options = array())
{
global $g5;
$res = @session_start($options);
// IE 브라우저 또는 엣지브라우저 또는 IOS 모바일과 http환경에서는 secure; SameSite=None을 설정하지 않습니다.
if (isset($_SERVER['HTTP_USER_AGENT'])) {
if (preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT'])
|| preg_match('/(iPhone|iPod|iPad).*AppleWebKit.*Safari/i', $_SERVER['HTTP_USER_AGENT'])
|| preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT'])
|| preg_match('~Trident/7.0(; Touch)?; rv:11.0~',$_SERVER['HTTP_USER_AGENT'])
|| !(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on')) {
return $res;
}
}
$headers = headers_list();
krsort($headers);
$cookie_session_name = method_exists('XenoPostToForm', 'g5_session_name') ? XenoPostToForm::g5_session_name() : 'PHPSESSID';
foreach ($headers as $header) {
if (!preg_match('~^Set-Cookie: '.$cookie_session_name.'=~', $header)) continue;
$header = preg_replace('~(; secure; HttpOnly)?$~', '; secure; HttpOnly; SameSite=None', $header);
header($header, false);
$g5['session_cookie_samesite'] = 'none';
break;
}
return $res;
}
}
[/code]