Media Log

세션과 쿠키에 대해 자세히 알아보는 시간을 갖어볼까 합니다.


쿠키(Cookie)란?


   쿠키는 지정된 내용을 고스란히 클라이언트(Client)측의 컴퓨터에 남겨놓아 필요시에 사용하는

   서버와의 연결고리로 쿠키라고 부르게 된 원인이 이처럼 클라이언트쪽에 과자 부스러기처럼 남아있다고

   해서 과자라는의미로 쿠키라고 부르게 되었다고 한다.


   그러나 보안에는 조금 결점이 있는데 그 이유가 추후에 사용하고자 하는 내용을 기록하게 되면

   그 내용이 고스란히 사용자의 컴퓨터(이하 클라이언트)에 남기때문이다.


   악성유저의 경우는 이를 악용하는 사례가 종종 생겨서 이방식만 있을땐 꽤 골치가 아팠었다..


   그래서 새롭게 나온 방식이 세션이라는 연결고리이며 병행하기도 한다.


 

세션(session)이란?


  세션은 쿠키(Cookie)와 다르게 지정한 정보들을 서버쪽에 남겨두고 세션정보만을 클라이언트(Client)쪽에

  남겨두어 보안성에서 조금더 나은 방식의 연결고리인것이다.


  세션과 쿠키의 차이점을 아래 그림으로 보면 이해가 빠를것이다.



 


 


   위 그림처럼 쿠키의 경우는 서버쪽에서 저장하고자 하는 데이터를 몽땅 클라이언트쪽에

   넘겨주어 저장하게 되며 필요시 저장된 데이터를 불러오는데 이때 클라이언트쪽에서

   서버쪽에 받았던 내용을 다시 전달시켜주게 됩니다..

   그렇게 되면 서버쪽에서 전달받은 내용을 가지고 여러가지 비교등을 하여 사용에 맞도록

   가공하여 사용하게되겠습니다..


  이와 반대로 세션은 서버쪽에 저장하고자 하는 데이터가 고스란히 저장되며

  저장된 세션의 고유키(구분할수 있는 문자등)만을 클라이언트쪽에 넘겨주어

  클라이언트쪽에서는 넘겨받은 값(세션의 고유키)만을 저장하게 됩니다..

  그리고 필요시에 클라이언트쪽에 세션의 고유키값을 가지고 있는 쿠키를

  불러오도록 요청하게 되는데 이때 클라이언트는 요청받은 쿠키의 내용을

  서버에 전달시켜줍니다..

  그렇게 되면 서버쪽에서는 이 값이 정상적인 값(고유키를 넘겨주었을때 전달된 내용들)인지를 확인하고

  해당 내용을 가지고 사용에 맞도록 가공하여 사용됩니다..


  위에 언급한 내용중 "고유키를 넘겨주었을때 전달된 내용들" 이라고 명시한 부분이 있는데

  여기서 말하는 내용들에는 몇가지 정보가 함축되어있습니다..

  세션을 생성시에 클라이언트쪽에 넘겨주는 내용에는 다음과 같은 내용들이 함께 전달됩니다..


  1. 본인의 세션을 구별할수 있는 고유의 키값

  2. 생성한 세션에 대한 아이디값

  3. 도메인주소

  4. 그외


 세션과 쿠키는 어떻게 사용할까?


 세션과 쿠키를 생성할때 공통점이 있습니다..

 둘다 헤더가 시작하기 전에 사용해야 한다는 공통점이 있는데


 여기서 헤더라는것은 세션이나 쿠키가 생성되기 전에 어떠한 내용이 그 앞에 존재한다면

 그것이 헤더가 됩니다..


 그러나 웹의 용어로 보면 헤더는 문서가 시작되는 첫머리가 되겠는데요..


 이 용어에 대해서는 생략하기로 하구요


 세션과 쿠키에서 의미하는 헤더는 자신들이 실행되기 전에 무언가가 출력되어있는 것에 대한

 의미를 두고 있다는것을 인지하시면 됩니다..


 쉽게 예제를 보면


ex)

 echo "룰루랄라";

 setcookie("test","하하하",0,"/);


라고 하면

  이것은 오류를 일으킵니다..


쿠키를 생성하기 전에 룰루랄라 라는 단어가 이미 출력이 되어있기때문에

오류를 일으키게 되는것입니다...


왜 오류를 일으킬까?


그 이유는 세션이나 쿠키는 자신의 일을 수행함에 있어 헤더를 수정하여 사용하기때문입니다..


수정하여 사용하여야 되는데 이미 어떤값이 출력된 상태이면 헤더가 이미 사용되었기때문에

수정이 불가능한 상태로 되버려서 수정할수가 없기때문에 오류가 생기는 거죠..


이때 발생되는 오류메세지는 아래와 같습니다..


Warning: Cannot modify header information - headers already sent by (output started at 경로/파일이름.php:라인번호) in /경로/파일이름.php on line 번호


해석하면 헤더에 정보를 수정할수 없다. 경로/파일이름.php의 라인번호에 있는 내용에 의해

이미 헤더는 전달되어져있다.


정도로 해석을 할수가 있겠네요..


그렇다면 쿠키와 세션은 어떻게 사용할까?



쿠키사용방법


쿠키는 setcookie() 라는 함수로 쿠키를 생성하거나 해제할수 있으며 $HTTP_COOKIE_VARS (구버전) 나 $_COOKIE (php 4.x 이후) 라는 예약변수를 이용해서 생성되어있는 쿠키내용을 가져올수 있습니다..


setcookie() 함수의 레퍼런스


setcookie("쿠키변수명",["내용",유지시간,"경로","도메인","보안여부","httponly"]);


쿠키변수명은 말 그대로 변수이름이며 추후 $_COOKIE["변수이름"]; 으로 호출할때 사용됩니다..


이 이후로는 옵션으로 사용하지 않아도 무방하지만 가능하면 경로까지는 설정하시는것이 좋습니다..


내용은 쿠키변수가 가지고 있을 데이터내용이며


유지시간은 이 쿠키를 얼마동안 유지시킬지를 설정하는 부분으로 기본값은 0이며 0은 브라우저가

닫히기 전까지를 의미합니다..


경로는 어느경로에서 작동할지를 설정하는것으로 "/" 로 설정시 해당 도메인의 모든 경로에서

작동될수 있습니다..


도메인은 이 쿠키를 어느 도메인에서 사용가능토록 할지를 설정하는 부분으로

설정시 이 쿠키는 설정된 도메인에서만 사용될수 있습니다..


보안여부는 https 를 이용한다면 True 로 설정하면 되며


httponly 는 http 프로토콜에서만 열람(사용)할수 있도록 할건지를 설정하는 부분으로 True 로 설정하면

http 프로토콜외엔 사용이 불가능해진다고 합니다...

본인은 경로까지만 사용하여 정확한 작동반응은 설명을 할수가 없겠네요..


쿠키를 파기(삭제 혹은 해제라고도 함)시키는 방법은 setcookie("쿠키변수명","",-1 혹은 설정한 시간만큼 빼주면 됨,"사용한 경로","도메인"...);

으로 파기시킬수 있습니다..


세션은 어떻게 사용할까?


세션은 session_start(); 라는 함수를 호출후에 session_register() 라는 함수를 이용하여

생성할수 있습니다..


세션 파기하는 방법은 변수내용을 빈값으로 전달하거나

session_destroy() 함수를 이용해서 파기시킬수 있습니다..


session_register() 의 레퍼런스는


session_register("세션변수명");


으로 세션변수는 앞에서 지정하여야 합니다..


ex)


$test = "세션내용";

session_register("test");


가 되겠네요..


이에 앞서 어떠한 헤더를 사용하기 전에 session_start(); 를 먼저 호출하여야 정상적으로

생성하고 사용할수 있겠습니다...



이상으로 세션과 쿠키에 대해 알아보았는데요..


알고보면 어려운것이 아님을 알수 있습니다..


제가 이렇게 오픈백과에 이런 내용을 올리는것은 지식인과 같은곳에서 같은 문제에 대해


많은 질문을 하시기때문에 하찮지만 이 내용으로 해결하시고 더불어 조금더 자신의 것으로

만드시길 바라면서 올려봅니다.

이 글에서는 오토셋 4.2.0 버전을 이용한 MySQL 연동 작업시 참고할 사항을 제공합니다.

1. MySQL 서버의 모든 설정은 기본적으로 UTF-8 로 셋팅되어 있습니다.

2. MySQL 설정 파일은 윈도우 설치 폴더 안의 my.ini 파일입니다.
오토셋을 통해 제어되는 MySQL 서버는 이 파일을 참조합니다.

3. 미리 생성된 DB 는 아래와 같으며, 적용된 콜레이션(Collation)은 각 DB 별 다릅니다.
- mydb : latin1_swedish_ci (기본값)
- mydb_utf8 : utf8_general_ci
- mydb_euckr : euckr_korean_ci

4. 사용자 계정 정보
- root : MySQL 서버 관리용 ID , 삭제 불가 , 초기 암호는 autoset
- sa : 일반 사용자 , 불필요시 삭제 가능 , 초기 암호는 autoset

5. 사용자 계정별, DB 연결 정보
- root : 모든 DB 에 접근 가능
- sa : mydb , mydb_utf8 , mydb_euckr  / 앞의 3개의 DB만 접근 가능

6. 기타 설정 사항
- 소켓 접속시 사용되는 socket 파일의 위치 (오토셋 설치 폴더\Server\temp\mysql.sock)
- MySQL 서버 설치 경로 (오토셋 설치 폴더\Server\mysql\)
- MySQL 데이터 보관 경로 (오토셋 설치 폴더\Server\mysql\data\)
- 에러 메시지 표시 언어 : 한국어

7. PHP 와 연동 시, 주의할 점
PhpMyAdmin 으로 확인하면, 분명 한글 데이터가 정상적으로 삽입되었지만
실제로 PHP 와 연동시, 한글 깨짐(물음표로 나오는 현상)이 나타나는 경우가 있습니다.

이것은 문자셋이 지정되지 않았기 때문에 발생한 것입니다.

mysql_connect 함수 호출 이후, mysql_query 함수를 이용하여
set names euckr 쿼리를 실행해보시기 바랍니다.
그러면, 한글이 정상적으로 나오게 됩니다.
관련된 예시가 4.2 버전대에는 홈 디렉토리(public_html)에 보시면,
"PHP_MySQL_Sample" 폴더가 있습니다.
해당 폴더의 PHP 코드는 DB 에 테이블 생성하고, 자료를 입력/출력하는 예제가 있습니다.
PHP와 MySQL 관련 작업시 참고하시면 좋겠습니다.

ANSI(EUC-KR)이 아닌 UTF-8로 PHP파일을 인코딩했고,
DB도 UTF-8문자셋을 사용하는데 한글이 제대로 표시되지 않는 경우에는
set name euckr; 대신에 set names utf-8; 을 실행해보시기 바랍니다.

<?php
$conn = mysql_connect ("localhost", "sa", "autoset");
mysql_query("set names euckr");
mysql_select_db("mydb_euckr");
?>

8. PHP 외, 다른 언어와 연동시... 혹은 MySQL 콘솔창에서 한글이 깨진다면?
7번과 같은 맥락의 문제입니다.
MySQL 접속 이후, 문자셋 쿼리(set names )를 실행함으로써 문자셋을 맞춰주시면 됩니다.

Trackback URL : http://blog.sorpyo.com/trackback/174

기본 컨섭은 
1. 클래스에서 DB 연동
2. 리스트를 가져와야 하는 클래스에서 배열로 데이타 저장후
    배열로 해당 내용을 메인 프로그램에서 받음.
3. DB 연결 종료
4. 필요항목에 해당 데이타를 뿌려줍니다.
(왜 이런짓을 하냐면요.. DB 연결시간을 조금이라도 줄일려고 하는^^:::)
먼저 메인 프로그램입니다.

<?php
include_once("./library/common/class.MySqlDbCon.php");
include_once("./library/common/class.BoardQuery.php");

$dbArray = array(); // 데이타 값을 받을 배열 선언

$dbclass = new MySqliDbCon("select"); // DB 연결 클래스 생성
$dbcon = $dbclass->connectDb();  // DB 연결
$boardclass = new BoardQuery($dbcon);  // DB 연결을 리스트를 가져올 클래스에 넘겨주면서 생성

$dbArray = $boardclass->queryTest();  // 리스트를  배열로 받아옴
$boardclass->boardClose(); // 연결 종료
$dbclass->closeDb();  // 연결 종료
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr"/>
</head>
<body>
게시판이나 기타 내용 부분이 보이는 <br>
이미 DB 접속은 끊었음.
<?
for($i = 0; $i <10; $i++) {
    echo $dbArray['ID'][$i];
    echo $dbArray['CODE'][$i];    
    echo $dbArray['SIDO'][$i];
    echo $dbArray['GUGUN'][$i];
    echo $dbArray['DONG'][$i];
    echo "<br>";
}
?>

</body>
</html>

DB 연동 클래스 파일
<?php
class MySqliDbCon {
    private $dbServer;        // DB의 호스트
    private $dbUser;        // DB 접속 user
    private $dbPassword;    // DB 접속 패스워드
    private $dbName;        // DB 명

    private $dbLink;            // 접속 DB 인자
    private $disCon;        // DB 접속 해재 확인
    // Select 실행 DB 연결
    public function conDbSelect() {
        $this->dbServer = "localhost";
        $this->dbUser = "사용자 이름";
        $this->dbPassword = "사용자 비밀번호";
        $this->dbName = "DB 이름";
    }
    // Insert, Update, Delete 실행 DB 연결.
    public function conDbChange() {
        $this->dbServer = "localhost";
        $this->dbUser = "사용자 이름";
        $this->dbPassword = "사용자 비밀번호";
        $this->dbName = "DB 이름";
    }

    // DB 연결 함수
    public function connectDb() {
        $this->dbLink = new mysqli($this->dbServer,$this->dbUser,$this->dbPassword,$this->dbName);
        if (mysqli_connect_errno()) {
            printf("데이타베이스 접속실패 : %s\n", mysqli_connect_error());
            exit();
        } else {
            return $this->dbLink;
        }        
    }
    // DB 종결 함수
    public function closeDb() {    
        if (!mysqli_connect_errno()) {
            $this->dbLink->close();
            $this->disCon = "Y";
        }
    }
    // 생성자 : 리플리케이션 사용시 DB server 를 select 와 change(i,u,d) 로 구분하여 접속
    public function __construct($dmlType) {
        if ($dmlType == "select") {
            $this->conDbSelect();
            echo "조회용 DB";                //테스트용 구분
        } else if ($dmlType == "change") {
            $this->conDbChange();
            echo "조작용 DB";                //테스트용 구분
        }
    }

    // 소멸자
    public function __destruct(){   
        if($this->disCon != "Y") {
            $this->closeDb();
        }
    }

}
?>

리스트를 뽑아오는 클래스 파일입니다.
<?php
class BoardQuery {
    private $dbLink;            // 접속 DB 인자
    private $stmt;
    private $dbArray = array();
    private $disCon;        //  해재 확인

    public function queryTest() {
        if($this->stmt = $this->dbLink->prepare("select ID,CODE,SIDO,GUGUN,DONG from softpage_zip limit 10")) {
            $this->stmt->execute();

            $this->stmt->bind_result($col1, $col2, $col3,$col4,$col5);
            
            $i = 0;
            while ($this->stmt->fetch()) {
                $dbArray['ID'][$i] = $col1;
                $dbArray['CODE'][$i] = $col2;    
                $dbArray['SIDO'][$i] = $col3;
                $dbArray['GUGUN'][$i] = $col4;
                $dbArray['DONG'][$i] = $col5;
                $i ++;
            }
            return $dbArray;
        }
    }

    public function __construct($dbCon) {
        $this->dbLink = $dbCon;
    }

    // 소멸자
    public function __destruct(){   
            $this->boardClose();
    }

    public function boardClose(){   
        if($this->disCon != "Y") {
            $this->stmt->close();
            $this->disCon = "Y";
        }
    }
}
?>

상기와 같습니다. 
아래의 에러부분들은 다 처리하고 올립니다..  소멸자를 안 쓰자니 허전해서 구지 쓰면 좀더 걸리는 부분이 많네요.. 이 부분에 대해서도 고수님들의 조언이 필요합니다..

다들 보시고 지적해 주십시요..  이미 다른분들의 좋은 자료가 있으면..혼동을 막기 위해서 삭제 하겠습니다.


출처 : PHPSCHOOL

FTP 명령어 모음
ascii
: 전송모드를 ASCII모드로 설정한다.(ascii또는 as)

binary : 전송모드를 BINARY모드로 설정한다.( binary또는 bi)

bell : 명령어 완료시에 벨소리를 나게한다.(bell)

bye : ftp접속을 종료하고 빠져나간다.(bye)

cd : remote시스템의 디렉토리를 변경한다.(cd 디렉토리명)

cdup : remote시스템에서 한단계 상위디렉토리로 이동한다.(cdup)

chmod : remote시스템의 파일퍼미션을 변경한다.(chmod 755 index.html)

close : ftp접속을 종료한다. (close)

delete : remote시스템의 파일을 삭제한다.(delete index.old)

dir : remote시스템의 디렉토리 내용을 디스플레이한다.(dir)

disconnect : ftp접속을 종료한다.(disconnect)

exit : ftp접속을 종료하고 빠져나간다.(exit)

get : 지정된 파일하나를 가져온다.(get index.html)

hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.(hash)

help : ftp명령어 도움말을 볼 수 있다.(help또는 help 명령어)

lcd : local시스템의 디렉토리를 변경한다.(lcd 디렉토리명)

ls : remote시스템의 디렉토리 내용을 디스플레이한다. (ls 또는 ls -l)

mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.( mdelete *.old)

mget : 여러개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)

mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.(mput *.html)

open : ftp접속을 시도한다.(open 168.126.72.51또는 open ftp.kornet.net)

prompt : 파일전송시에 확인과정을 거친다. on/off 토글 (prompt)

put : 하나의 파일을 remote시스템에 올린다.(put index.html)

pwd : remote시스템의 현재 작업디렉토리를 표시한다.(pwd)

quit : ftp접속을 종료하고 빠져나간다.(quit)

rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.(rstatus)

rename : remote시스템의 파일명을 바꾼다.(remote 현재파일명 바꿀파일명)

rmdir : remote시스템의 디렉토리을 삭제한다.(rmdir 디렉토리명)

size :remote시스템에 있는 파일의 크기를 byte단위로 표시한다.(size index.html)

status : 현재 연결된 ftp세션모드에 대한 설정을 보여준다.(status)

type : 전송모드를 설정한다.(type 또는 type ascii 또는 type binary)

ftp사용법

# ftp
ftp>open 호스트이름 또는 아이피 포트입력할려면 한칸 띄고 포트번호 www.naver.com 2987 이런식으로
ftp> 아이디
ftp> 암호

ftp>prompt -> 삭제나 생성등을 할때 예스 노우를 묻지 않게 한다.
ftp>passive -> 패시브모드를 끄거나 킨다.