728x90

출처 : http://cacung82.blog.me/10035514681


n         쿠키란?

ü        쿠키란 서버측에서 클라이언트측에 상태 정보를 저장하고 추출할 수 있는 메커니즘

ü        클라이언트의 매 요청마다 웹 브라우저로부터 서버에게 전송되는 정보패킷의 일종

ü        HTTP에서 클라이언트의 상태 정보를 클라이언트의 하드 디스크에 저장하였다가 필요 시 정보를 참조하거나 재사용할 수 있음.

ü        사용 예

   방문했던 사이트에 다시 방문 하였을 때 아이디와 비밀번호 자동 입력

   팝업에서 오늘 이 창을 다시 보지 않음체크

ü        쿠키의 제약조건

   클라이언트에 총 300개까지 쿠키를 저장할 수 있다

   하나의 도메인 당 20개의 값만을 가질 수 있다

   하나의 쿠키 값은 4096Byte까지 저장 가능하다

하나의 도메인에서 설정한 쿠키값이 20개를 초과하면 가장 적게 사용된 쿠키부터 지워짐. 또한 쿠키는 기존에 설정한 값이 있는 곳에 값을 저장하거나 배열형태의 쿠키에 단일 값을 저장하려고 할 때 아무런 경고 없이 덮어쓰기 때문에 주의를 해야 한다.

 

n         세션이란?

ü     세션이란 클라이언트와 웹서버 간에 네트워크 연결이 지속적으로 유지되고 있는 상태를 말함

ü     클라이언트가 웹서버에 요청하여 처음 접속하면 JSP(혹은ASP)엔진은 요청한 클라이언트에 대하여 유일한 ID를 부여하게 되는데, ID를 세션이라 부른다

ü     세션 ID를 임시로 저장하여 페이지 이동 시 이용하거나, 클라이언트가 재 접속 했을 때 클라이언트를 구분할 수 있는 유일한 수단이 된다

ü     세션의 장점

  각각의 클라이언트마다 고유의 ID 부여

  세션 객체마다 저장해 둔 데이터를 이용하여 서로 다른 클라이언트의 요구에 맞게 서비스 제공

  클라이언트 자신만의 고유한 페이지를 열어놓아서 생길 수 있는 보안상의 문제 해결 용이

n         쿠키와 세션의 차이점

 쿠키(cookie)와 세션(session)은 기능상 비슷한 역할을 하고, 동작원리도 비슷하다. 왜냐하면, 일반적인 세션은 쿠키를 바탕으로 동작하기 때문이다. 그러나 가장 중요한 차이점은 저장되는 곳이 다르다는 것이다. 쿠키는 클라이언트에 저장되고, 세션은 서버에 저장된다. 쿠키의 경우에는 서버의 자원을 전혀 사용하지 않지만, 세션의 경우에는 서버에 저장되기 때문에 서버의 자원을 사용할 수가 있다. 쿠키와 세션의 만료 되는 기간도 다르다.

n    쿠키와 세션의 차이점()

구분

쿠키

세션

저장 위치

클라이언트

서버

저장 형식

텍스트형식

Object

종료 시점

쿠키 저장 시 설정(설정하지 않으면 브라우저 종료 시 소멸)

정확한 시점을 알 수 없다

    

클라이언트의 자원을 사용

서버의 자원을 사용

용량 제한

한 도메인 당 20, 쿠키 하나 당 4KB, 300

서버가 허용하는 한 용량에 제한이 없음

 

아래 내용은 위의 출처와는 별개로 별도 작성한 사항이다.


세션은 서버 측에 존재하기 때문에 web 서버가 주기적으로 세션의 상태를 확인할 수 있어서 특정 시간동안 web site 내에서 어떠한 이동도 발생하지 않으면 사용자가 나간 것으로 간주하여 세션을 삭제할 수 있다.

기본적으로 24분을 기준으로 하여 세션을 삭제한다.


※ PHP 5.4 부터 session_register 기능이 없어졌다.

<?php

// PHP에서 세션을 사용하려면 세션을 시작해줘야 한다.

// 세션을 시작하지 않은 페이지에서는 세션 값을 사용할 수 없다.

if(!isset($_SESSION)) {
    session_start();
}

if(!function_exists('session_register'))
{
    // PHP 5.4 부터 session_register 가 없어져 만들어진 코드
    // var_dump($_SESSION);
    foreach($_SESSION as $sKey => $sVal)
    {
        if(!isset(${$sKey}))
        {
            ${$sKey} = $sVal;
        }
    }

    function session_register($key)
    {
        $_SESSION[$key] = $GLOBALS[$key];
    }
}

?>


이런 코드도 사용하지 않는게 좋다.

PHP에서 권고하는 $_GET, $_POST, $_REQUEST 배열로 변수를 넘기는 걸 사용하는게 좋다.

그래야 android 연동, C# 과의 연동할 때에도 제대로 연동된다.


index.php 파일에서 코드 작성시에 기본적으로 이런 형태로 구성된다.

세션 값이 존재하면 자동으로 main.php 파일로 이동하고, 세션이 없으면 Login Form 을 띄운다.


if(isset($_SESSION['userID'])){
    echo("<meta http-equiv='Refresh' content='0; URL=main.php'>");
} else {
    include($_SERVER['DOCUMENT_ROOT'].'/loginForm.php');
}


세션 유지 시간 설정값은 php.ini 파일에 있다.

session.cache_expire = 180

로 3분으로 되어 있다. 늘리고 싶으면 값을 조정하고 Apache 를 restart 해야 한다.


[Session]
session.save_handler = files
session.save_path = "/temp"    //세션이 저장될 경로
session.use_cookies = 1          //클라이언트의 쿠키로 세션 아이디를 저장함
session.name = PHPSESSID     //세션아이디를 저장할 쿠키 이름
session.auto_start = 0            // 자동으로 세션을 시작함
session.cookie_lifetime = 0     // 세션아이디를 저장할 쿠키의 폐기시간
session.cookie_path = /         //세션 아이디를 저장할 쿠키 경로
session.cookie_domain =        //세션 아이디를 저장할 쿠키의 도메인


세션을 사용하기 원하는 파일에서 맨 위에 아래와 같이 코드를 추가해준다.

<?php

if(!isset($_SESSION)) {
    session_start();
}

?>

보통은 session_start(); 만 적어주면 되는데 jQuery 를 이용하여 코딩을 하다보면 파일을 include_once, require_once 로 파일을 include 하는 경우가 많다.

이때 세션이 있는 상태에서 또 세션이 들어오면 세션 중복 경고 메시지가 뜬다.

이런 경우를 방지하기 위해서 위와 같이 코드를 적어주는게 좋다.


<?php
// DB 연동후에 가져온 결과값
if(is_array($row)){
    if($row[0]==1){
        if(!isset($_SESSION)) {
            session_start();
        }
        $_SESSION['userID'] = $row['userID'];;
        $_SESSION['userIdx'] = $row['idx'];
    }
}
?>


세션이 동작하지 않을 때

ㅇ 웹브라우저 보안 수준이 높게 설정된 경우

ㅇ 웹브라우저 도구->인터넷옵션->개인정보에서 설정이 모든 쿠키를 차단하는 경우


세션 삭제

<?php
if(!isset($_SESSION)) {
    session_start();
}
session_destroy(); 
?>


session_unset("변수");  // 현재 변수의 값을 삭제하고 변수도 소멸시키는 함수

session_unset($_SESSION['userID']);


-----------------------------------------------------------------------------------------------

<?php
if(!isset($_SESSION)) {
    session_start();
}
$POST['userID']='jsk005@naver.com';
$_SESSION['userID']=$POST['userID'];
$id=$_SESSION['userID'];

if (isset($_SESSION['userID']) && !empty($_SESSION['userID']))
 echo $_SESSION['userID']. "님 반갑습니다.";
else
 echo "SESSION 없다.";
?>


세션 공격 방어


세션 토큰이 생성과는 과정은 위의 그림과 같다.

1. 서버에서 로그인 성공이후 세션 정보를 생성하면 해당 정보를 지정한 디렉토리에 PHPSESSIONID 를 저장한다.

2. 클라이언트는 세션 정보를 브라우저를 통해 COOKIE로 저장해둔다.


세션 쿠키의 값을 알아낼 수 있다면 아이디와 비번 따위는 훔칠 필요도 없다.

세션 쿠키를 사용하면 남의 아이디로 로그인된 상태로 만들 수 있다.

세션 고정 공격은 공격자가 정상적으로 얻을 수 있는 권한보다 높은 권한을 가진 SID를 획득하기 위해 수행하는 공격이므로, 로그인 하는 등 권한이 변경될 때마다 SID를 재생성한다면 무력화시킬 수 있다.

session_regenerate_id();
이 함수는 현재 세션ID를 새로운 세션 ID로 바꿔주는 함수다.
이 함수는 session_save_path 함수에서 절대 경로를 사용해야 한다.
주로 세션 고정 공격을 방지하는 데 도움이 된다.
그럼 언제 사용해야 하는가? 인증(Authentication) 단계(login, logout)가 바뀔 때마다 변경하는게 좋다.

$user = $c->getUser($userID, $password);
if ($user != false) {
    session_regenerate_id();
    $_SESSION['userID'] = $user['userID'];
    $_SESSION['userNM'] = $user['userNM'];
    $_SESSION['access'] = $user['access']; // Authorization (인가) : 특정 리소스에 접근할 수 있는 권한을 부여
}

이렇게 하고 크롬 브라우저 개발자 모드 network 에서 헤더정보를 확인해보면

Cookie: PHPSESSID=h0mf6k6ok9vhitq2v4l605d6d4
Cookie: PHPSESSID=q9or3cl6t8njqui5t28ql3ksi6
로그인/로그아웃 할 때마다 새로운 세션 ID로 변경된 것을 확인할 수 있다.


http/https 혼합 환경에서 세션 보안 강화하기 https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=79296 참조


변수에 대한 이해 http://link2me.tistory.com/996 에 isset 과 empty 에 대한 설명이 있다.

'Web 프로그램 > PHP 응용 및 활용' 카테고리의 다른 글

[PHP] 날짜 함수 정리  (0) 2015.08.03
[PHP] 설문조사 종료날짜 체크  (0) 2015.05.27
[PHP] 홈페이지 설정 정보 확인  (0) 2015.04.28
PHP 기본 함수  (0) 2015.03.07
[PHP] 한글자르기 substr  (0) 2015.01.04
블로그 이미지

Link2Me

,