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

🙏SIR UI/UX 디자인 의뢰(~7/31)
아이폰으로 접속했을때 안되네요. 혹시 아시는 분?

QA

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

그누보드5(영카트) 버전

5.6

사용 PHP 버전

7.6

본문

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

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


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

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

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

이 질문에 댓글 쓰기 :

답변 4

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

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

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

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

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

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

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

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

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

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

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

이해가 잘 되지 않네요..
커스텀 페이지에서도 common.php는 포함되어 있습니다.
현재 common.php에서는 아래와 같이 설명해주고 있는데요.
ios를 사용하려면 samesite=Lax로 해줘야 되고
전자결제나 api를 사용하려면 samesite=none으로 해줘야 된다는 말씀이신가요?


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

네~ 그 부분, 기본적으로 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;
    }
}

보통 그런경우는 아이폰 내에 브라우저 커스텀이라던지 사파리 설정

그리고 폰트 강제 설정 등으로 원하는 결과가 안나올수 있습니다.

아이폰에 크롬 설치하셔서 테스트 해보세요.

답변을 작성하시기 전에 로그인 해주세요.
전체 270
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT