채택완료

아이폰으로 접속했을때 안되네요. 혹시 아시는 분?

크롬. 엣지, 웨일,파이어폭스,오페라의 웹브라우저와 모바일을 통한 안드로이드 사용시에는 프로그램이 정상적으로 잘 돌아갑니다.
하지만 아이폰에서만네트웤 손실로 safari가 제데로 작동을 안한다는 메세지가 뜨고 안되네요...

(아이패드는 안해봤구요) 


프로그램에는 이상이 없는거 같은데요..

혹시 서버나 사파리 브라우저 문제 인가요?

경험하신 고수님 계시면 답변 부탁드려요...

|

답변 4개 / 댓글 3개

채택된 답변
+20 포인트

세션/쿠키 설정에서 SameSite 속성이나 보안 헤더가 iOS 정책과 충돌해서일 겁니다.

세션 쿠키 설정에 보안과 SameSite=None이 확연하게 지정되여야 합니다.
 

SameSite=None을 설정하지 않음 기본으로 다른 사이트 요청에서 쿠키가 차단됩니다.

특히 사파리와 최신 브라우저에서는 SameSite=Lax가 기본값이므로,

POST 요청이나 iframe 내부에서는 쿠키가 전송되지 않을 수 있습니다.

따라서, 외부 사이트에서 로그인 세션을 유지하거나,

API 연동, OAuth 로그인, 결제 시스템을 사용할 경우

SameSite=None을 설정하셔야 합니다.
 

그누보드5는 common.php를 통해 전역으로 세션/쿠키를 관리합니다.

그러나, 커스텀 페이지가 이를 포함하지 않는다면 사파리에서 쿠키가 차단되어

네트워크 손실 문제(로그인 유지 실패, 세션 끊김 등)가 발생할 수 있을 것입니다.

답변에 대한 댓글 3개

이해가 잘 되지 않네요..
커스텀 페이지에서도 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]
네~ 그 부분, 기본적으로 common.php의 설정이 모든 문제를 해결하도록 구성되어 있으므로,
커스텀 페이지라도 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:// 로 접속했는지 확인해 보세요..
사파리는 이 부분이 좀 민감 한것 같았습니다.

답변을 작성하려면 로그인이 필요합니다.