세션 처리 세션 INI 설정 보안

세션 관련 INI 설정을 보호함으로써 개발자는 세션 보안을 향상시킬 수 있습니다. 일부 중요한 INI 설정에는 권장 설정이 없습니다. 개발자는 세션 설정을 강화할 책임이 있습니다.

  • session.cookie_lifetime=0

    0은 특별한 의미를 가지고 있습니다. 쿠키를 영구 저장소에 저장하지 않도록 브라우저에 알립니다. 따라서 브라우저가 종료되면 세션 ID 쿠키가 즉시 삭제됩니다. 개발자가 이를 0이 아닌 다른 값으로 설정하면 다른 사용자가 세션 ID를 사용하도록 허용할 수 있습니다. 대부분의 응용 프로그램은 이를 위해 "0"을 사용해야 합니다.

    자동 로그인 기능이 필요한 경우 개발자는 자체 보안 자동 로그인 기능을 구현해야 합니다. 이를 위해 수명이 긴 세션 ID를 사용하지 마십시오. 자세한 내용은 위의 관련 섹션에서 확인할 수 있습니다.

  • session.use_cookies=On

    session.use_only_cookies=On

    HTTP 쿠키에는 몇 가지 문제가 있지만 쿠키는 세션 ID를 관리하는 데 여전히 선호되는 방법입니다. 가능한 경우에만 세션 ID 관리를 위해 쿠키를 사용하십시오. 대부분의 응용 프로그램은 세션 ID에 쿠키를 사용해야 합니다.

    session.use_only_cookies=Off인 경우 세션 ID 쿠키가 초기화되지 않은 경우 세션 모듈은 GET/POST/URL에 의해 설정된 세션 ID 값을 사용합니다.

  • session.use_strict_mode=On

    그러나 session.use_strict_mode 활성화는 보안 세션에 필수입니다. 기본적으로 비활성화되어 있습니다.

    이것은 세션 모듈이 초기화되지 않은 세션 ID를 사용하는 것을 방지합니다. 달리 말하면 세션 모듈은 세션 모듈에서 생성한 유효한 세션 ID만 수락합니다. 사용자가 제공한 세션 ID를 거부합니다.

    쿠키 사양으로 인해 공격자는 쿠키 데이터베이스 또는 JavaScript 삽입을 로컬로 설정하여 제거할 수 없는 세션 ID 쿠키를 배치할 수 있습니다. session.use_strict_mode는 공격자가 초기화한 세션 ID가 사용되는 것을 방지할 수 있습니다.

    메모: 공격자는 장치로 세션 ID를 초기화하고 피해자의 세션 ID를 설정할 수 있습니다. 남용하려면 세션 ID를 활성 상태로 유지해야 합니다. 공격자가 이 시나리오에서 공격을 수행하려면 추가 단계가 필요합니다. 따라서 session.use_strict_mode는 완화 역할을 합니다.

  • session.cookie_httponly=On

    JavaScript에서 세션 쿠키에 대한 액세스를 거부합니다. 이 설정은 JavaScript 삽입에 의해 쿠키를 가로채는 것을 방지합니다.

    세션 ID를 CSRF 토큰으로 사용할 수 있지만 권장하지 않습니다. 예를 들어 HTML 소스를 저장하여 다른 사용자에게 보낼 수 있습니다. 개발자는 보안 강화를 위해 웹 페이지에 세션 ID를 작성해서는 안 됩니다. 거의 모든 애플리케이션은 세션 ID 쿠키에 대해 httponly 속성을 사용해야 합니다.

    메모: CSRF 토큰은 세션 ID와 마찬가지로 주기적으로 갱신되어야 합니다.

  • session.cookie_secure=On

    프로토콜이 HTTPS인 경우에만 세션 ID 쿠키에 대한 액세스를 허용합니다. HTTPS를 통해서만 웹사이트에 액세스할 수 있는 경우 이 설정을 활성화해야 합니다.

    HSTS는 HTTPS를 통해서만 액세스할 수 있는 웹사이트에 대해 고려해야 합니다.

  • session.cookie_samesite="Lax" 또는 session.cookie_samesite="Strict"

    PHP 7.3부터 세션 ID 쿠키에 대해 "SameSite" 속성을 설정할 수 있습니다. 이 속성은 CSRF(Cross Site Request Forgery) 공격을 완화하는 방법입니다.

    Lax와 Strict의 차이점은 HTTP GET 메서드를 사용하는 등록 가능한 다른 도메인에서 시작된 요청에서 쿠키의 액세스 가능성입니다. Lax를 사용하는 쿠키는 등록 가능한 다른 도메인에서 시작된 GET 요청에서 액세스할 수 있지만 Strict를 사용하는 쿠키는 액세스할 수 없습니다.

  • session.gc_maxlifetime=[choose smallest possible]

    session.gc_maxlifetime은 사용하지 않는 세션 ID를 삭제하기 위한 설정입니다. 이 설정에 의존하지 않는 것이 좋습니다. 개발자는 타임스탬프가 있는 세션의 수명을 스스로 관리해야 합니다.

    세션 GC(가비지 컬렉션)는 session_gc()를 사용하여 가장 잘 수행됩니다. session_gc() 함수는 작업 관리자가 실행해야 합니다. 예를 들어 시스템과 같은 UNIX에서 cron.

    GC는 기본적으로 확률에 의해 수행됩니다. 이 설정은 오래된 세션의 삭제를 보장하지 않습니다. 개발자가 이 설정에 의존할 수는 없지만 가능한 가장 작은 값으로 지정하는 것이 좋습니다. 사용되지 않는 세션이 적절한 빈도로 삭제되도록 session.gc_probabilitysession.gc_divisor를 조정합니다. 자동 로그인 기능이 필요한 경우 개발자는 자체 보안 자동 로그인 기능을 구현해야 합니다. 자세한 내용은 위를 참조하세요. 이 기능에 긴 수명 세션 ID를 사용하지 마십시오.

    메모: 일부 세션 저장 처리기 모듈은 확률 기반 만료에 대해 이 설정을 사용하지 않습니다. 예를 들어 멤캐시, 멤캐시. 자세한 내용은 세션 저장 처리기 설명서를 참조하십시오.

  • session.use_trans_sid=Off

    투명한 세션 ID 관리의 사용은 금지되지 않습니다. 개발자는 필요할 때 이를 사용할 수 있습니다. 그러나 투명한 세션 ID 관리를 비활성화하면 세션 ID 주입 및/또는 누출 가능성을 제거하여 일반 세션 ID 보안이 향상됩니다.

    메모: 북마크된 URL, 이메일로 전송된 URL, 저장된 HTML 소스 등에서 세션 ID가 누출될 수 있습니다.

  • session.trans_sid_tags=[limited tags]

    (PHP 7.1.0 >=) 개발자는 불필요한 HTML 태그를 다시 작성해서는 안 됩니다. 기본값은 대부분의 용도에 충분해야 합니다. 이전 PHP 버전은 대신 url_rewriter.tags를 사용합니다.

  • session.trans_sid_hosts=[limited hosts]

    (PHP 7.1.0 >=) 이 INI는 트랜스 시드 재작성을 허용하는 화이트리스트 호스트를 정의합니다. 신뢰할 수 없는 호스트를 추가하지 마십시오. 세션 모듈은 이 설정이 비어 있는 경우에만 $_SERVER['HTTP_HOST']를 허용합니다.

  • session.referer_check=[originating URL]

    session.use_trans_sid가 활성화된 경우. 세션 ID 주입의 위험을 줄입니다. 웹사이트가 http://example.com/인 경우 http://example.com/을 설정합니다. HTTPS 브라우저에서는 리퍼러 헤더를 보내지 않습니다. 브라우저는 구성에 따라 리퍼러 헤더를 보내지 않을 수 있습니다. 따라서 이 설정은 신뢰할 수 있는 보안 수단이 아닙니다. 이 설정을 사용하는 것이 좋습니다.

  • session.cache_limiter=nocache

    인증된 세션에 대해 HTTP 콘텐츠가 캐시되지 않았는지 확인합니다. 콘텐츠가 비공개가 아닌 경우에만 캐싱을 허용합니다. 그렇지 않으면 콘텐츠가 노출될 수 있습니다. HTTP 콘텐츠에 보안에 민감한 데이터가 포함되지 않은 경우 "private"가 사용될 수 있습니다. "private"는 공유 클라이언트에 의해 캐시된 개인 데이터를 전송할 수 있습니다. "public"은 HTTP 콘텐츠에 개인 데이터가 전혀 포함되지 않은 경우에만 사용해야 합니다.

  • session.sid_length="48"

    (PHP 7.1.0 >=) 세션 ID가 길수록 세션 ID가 더 강해집니다. 개발자는 세션 ID 길이를 32자 이상으로 고려해야 합니다. session.sid_bits_per_character="5"인 경우 최소 26자가 필요합니다.

  • session.sid_bits_per_character="6"

    (PHP 7.1.0 >=) 세션 ID 문자에 비트가 많을수록 세션 모듈에 의해 생성된 세션 ID는 동일한 세션 ID 길이에 대해 더 강해집니다.

  • session.hash_function="sha256"

    (PHP 7.1.0 <) 더 강력한 해시 함수는 더 강력한 세션 ID를 생성합니다. MD5 해싱 알고리즘으로도 해쉬 충돌이 일어날 가능성은 거의 없지만 개발자는 SHA-2 또는 sha384 및 sha512와 같은 더 강력한 해싱 알고리즘을 사용해야 합니다. 개발자는 사용된 해싱 함수에 대해 충분히 긴 entropy를 공급해야 합니다.

  • session.save_path=[non world-readable directory]

    /tmp(기본값)와 같이 누구나 읽을 수 있는 디렉토리로 설정하면 서버의 다른 사용자가 해당 디렉토리의 파일 목록을 가져와 세션을 가로챌 수 있습니다.