본문 바로가기
PHP/생활코딩

5/28 생활코딩

by SKim입니다 2020. 5. 28.

* 오늘의 진도

 PHP

  쿠키와 세션

 

21. 쿠키와 세션 - PHP 쿠키

파일과 DB의 공통점은 무언가를 저장하는 기능이다.

쿠키와 세션도 마찬가지로 사용자의 데이터를 저장하기 위한 용도로 사용한다.

 

쿠키와 세션은 방식이 조금 다르기는 하지만,

쿠키와 세션이 파일와 DB와 구분되는 것은

쿠키와 세션, 그중에 특히 쿠키가, 웹브라우저이 데이터를 저장하는 방식이라는 점에서 파일과 DB와 구분된다.

 

파일과 DB는 데이터를 서버 상에 저장한다.

쿠키를 쓰기 위해서는 setCookie와 $_COOKIE라는 변수를 사용한다.

 

첫번째꺼 2행 - cookie1이라는 이름을 가진 생활코딩이라는 데이터가 사용자의 브라우저에 저장된다.

cookie1이 key이고 생활코딩이 value가 되는 것이다.

 

3행 - time()은 현재 시각을 유닉스 타임스탬프라는 형태로 리턴해주는 함수이다.

 그 시간을 (2행에서의 생활코딩처럼) 쿠키로 저장한다.

 

 time()+60은 time이 표시하는 현재 시간으로부터 60초 후를 의미한다.

→ 지금부터 60초 이후까지만 이 데이터가 유효하다는 뜻

 그 시간이 지나면 데이터는 자동으로 브라우저에서 삭제된다.

 

리로드하면 숫자가 올라간다.

쿠키1을 실행시킨 시각 기준으로 지나간 시간만큼 숫자가 올라간다.

 

HTTP라는 표준 통신방식을 이용해서 웹을 구동하는데,

HTTP는 상태가 없는 통신이다.

즉, 사용자가 서버에 어떤 행위를 했고,

그 다음에 서버에 어떤 데이터를 전달하고 받아올 때는

그것을 식별할 수 있는 방법이 없다는 것이 HTTP의 단점이다.

 

이것을 보완해줄 수 있는 방법 중 하나가 쿠키와 세션이다.

 

파이어폭스의 플러그인인 파이어버그를 설치하면 파이어쿠키라는 플러그인을 설치할 수 있다.

이것을 이용하여 현재 웹페이지에서 사용하고 있는 쿠키들을 열람할 수 있고 실시간으로 변경할 수도 있다.

 

리로드했을 때 쿠키1 쿠키2의 변화

만료 기간 숫자가 갱신된다. - time을 설정했기 때문에

 

세션 - 이 사용자가 브라우저를 닫는 순간, 쿠키에 저장된 데이터는 휘발해버리는 경우에 세션이라고 한다.

 

 

setCookie라는 함수는 쿠키를 사용하는 열쇠같은 기능을 한다.

 

https://www.php.net/manual/en/function.setcookie.php

 

PHP: setcookie - Manual

The server my php code is running on has sessions disabled so I am forced to store a fair bit of arbitrary data in cookies.  Using array names was impractical and problematic, so I implemented a splitting routine.  I do not serialize any class instances,

www.php.net

$name은 cookie1이라는 String을 전달. 쿠키의 이름.

 

$value는 쿠키의 값.

 

$expire는 만료라는 뜻이고, 아까 time이라고 하는 시간에 적어져서 이 쿠키가 언제까지 유효할 것인가를 지정했다.

 

$path는 이 쿠키가 어떤 경로에서 실행하는지를 지정한다.

쿠키에 경로를 적어주면, 이 쿠키는 해당 경로에 진입했을 때만 사용 가능하다.

만약 rasmus라고 하는 path위의, 그냥 도메인만 치고 들어갔을 때는 쿠키가 리턴되지 않는다.

 

$domain을 적어주면, 해당 도메인 안에서만 쿠키가 유효하다.

 

 

 

쿠키는 보안상 신뢰할 수 없는 데이터이다.

사용자가 로그인했을 때, 그 로그인에 대한 ID나 PW같은 것들을

쿠키에 절대 저장하면 안 된다.

∵ 다른 사람이 쿠키를 보거나 훔쳐갈 수 있다.

→ 그러한 데이터들은 세션을 통해서 처리해야 한다.

쿠키에는 유출되어도 전혀 문제되지 않는 데이터만 저장해야 한다.

 

 

 

21. 쿠키와 세션 - PHP에서 세션 사용하기1

쿠키나 세션이나, 사용자의 상태를 유지시킨다는 측면에서는 같다.

같은 목적으로 사용되지만, 결정적인 차이는,

쿠키가 모든 데이터를 브라우저의 쿠키라는 형태로 저장하는 것에 비해서

세션은 단지 현재 이것이 누구인지를 식별할 수 있는 식별자만을 브라우저에 저장하고,

실질적인 데이터는 서버에 파일이나 DB로 저장한다는 것이다.

 

즉, 쿠키는 모든 정보를 브라우저에 저장하기 때문에 데이터가 유출될 위험이 있다.

세션은 사용자의 식별자만을 로컬(브라우저)에 저장하고,

개인적인 데이터들은 서버상에 존재하기 때문에,

누군가가 와서 단지 세션만을 가지고 그 사용자의 정보를 훔쳐가기는 어렵다.

 

즉, 쿠키보다 세션이 훨씬 더 보안적으로 유리하다.

하지만 쿠키id 조차도 유출되면 위험하다.

 

일반적으로 사용하는 세션이라는 단어는,

강의 시간 등, 한 주제로 계속해서 연결되는 시간을 말한다.

 

사용자를 식별할 수 있는 식별자가 세션id(=sid)이다.

 

 

* 세션 생성 *

 

2행 - session_save_path로 시작한다. 이것은 대부분 사용 안한다.

이게 뭐냐면 사용자가 어떤 세션 데이터를 저장할 때

ex) 타이틀은 생활코딩이다

이 데이터를 모든 페이지에서 가져오고 싶을 때

세션 정보(생활코딩이라는 정보)가 서버상에 파일로 저장되는데

그 파일이 어디에 저장될 것인가를 지정하는 것이 session_save_path이다.

 

여기서는 디버깅에 대한 설명을 돕기 위해서 설정해놓은 것이고,

만약 그 파일을 다른 곳에 저장하고 싶으면 이 함수를 이용하면 된다.

 

session_start()라는 함수는 세션을 사용하는 경우에 반드시 로직의 초입에 작성해야 한다.

만약 화면상에 출력되는 데이터이후에 session_start() 함수를 호출하게 되면,

저 데이터는 헤더라는 형태의 데이터로 전달되기 때문에, 에러가 난다.

프로토콜 위반이다.

 

이 예제를 실행해보자.

현재 이 웹페이지에 많은 쿠키들이 구워져 있다.

 

다 삭제하자.

 

남아있는 쿠키들은 다른 도메인에서 사용되는 것이기 때문에 삭제가 안 된 것이다.

현재 보고있는 웹페이지의 쿠키들만 삭제됐다.

 

이 상태에서 F5를 누르면, 이 스크립트(예제)는

session_start()라는 함수가 실행되면서

내부적으로 이 세션 id에 해당되는 쿠키가 브라우저에 구워져 있는지(저장되어 있는지)를 체크해서

만약에 브라우저에 쿠키가 구워져있지 않다면

세션 id를 만들어서 그 세션 id를 브라우저에 저장한다.

 

리로드를 하니 PHPSESSID라는 쿠키가 생성되었다.

 

다시한번 설명하면

이 php 예제에 접근하게 되면

session_start()라는 함수가 호출되면서

만약 이 웹페이지에 쿠키가 구워져있지 않다면

세션id 값을 만들어서 PHPSESSID라는 이름으로 쿠키를 굽고

쿠키를 구우면서 동시에 그 쿠키의 값과 일치하는 세션 파일을 만든다.

 

이 세션 파일 안에는 사용자가 지정한 $_SESSION이라는 변수에

title이라고 하는 인덱스를 지정한 다음에

생활코딩이라고 적으면,

 

$_SESSION라는 전역변수 안에 있는 내용을

세션 파일 안에 저장하게 되는 것이다.

 

 

* 세션 데이터의 사용 *

 

첫 번째로 3행애서 session_save_path로 세션 파일이 저장되는 위치를 지정했다.

 

세션이 사용되는 모든 곳에서는 session_start()를 실행시켜줘야 한다.

 

$_SESSION에 title이라는 값을 줬다.

→ 이 예제 파일은 앞선 예제 파일과 다른 파일임에도 불구하고,

이 title을 호출했을 때, 이 앞에서 저장한 '생활코딩'을 가져온다면,

이 웹페이지는 앞선 예제 파일과 이 예제 파일의 상태가 유지되고 있다고 할 수 있다.

 

6행의 .session_id() 함수는 위의 그림에서 회색으로 선택한 부분을 값으로 리턴하는 함수이다.

즉, 현재 사용하고 있는 세션 파일에 담겨있는 내용을 화면에 뿌려주라는 얘기이다.

 

예제 2를 리로드하면 다음과 같은 화면이 나온다.

첫 번째 '생활코딩'은 5행에 의해 실행된다.

 

두 번째는 사람이 알아보기 조금 힘들지만 대충 이해가 간다.

title은 생활코딩이다.

js는 문자열이고 12는 데이터의 길이를 의미한다. 

 

 

 

그래서 사용자가 $_SESSION이라는 전역변수에 저장한 데이터가

php가 자동으로 내부적으로 생성하는 세션 파일에 데이터가 기록되고,

 

다른 페이지에 접근했을 때,

로컬에 저장돼있는 세션id로 사용자를 식별해서

그 사용자의 세션id에 해당되는 파일을 php가 찾아서

그 안에 있는 데이터를 가져오는 것이다.

 

그리고 두 번째 예제에서는

$_SESSION라는 전역 변수를 셋팅해서 로직에 공급한다.

그럼 로직에서는 echo같은 것을 통해서 자기가 원하는 데이터를 가져갈 수 있게 된다.

 

 

세션 관련해서는 쿠키를 사용하지만,

쿠키는 모든 브라우저에서 사용할 수 있다고 보장할 수 없다.

그런 경우에 php는 쿠키가 아니라 파라미터를 이용하기도 한다.

 

현재 사용자가 누구인지에 대한 식별자를 url 뒤쪽에 붙여서 파라미터로 전달할 수도 있다.

그래서 페이지 이동할 때마다 url에 파라미터가 쫓아다니면서 이 사람이 누군지를 계속해서 서버에게 알려준다.

 

 

21. 쿠키와 세션 - PHP에서 세션 사용하기2

* 세션을 이용해서 로그인 기능 구현하기 *

이번 시간에는 세션을 실질적으로 어떻게 사용하는지,

사용자를 인증하고, 인증된 사용자의 로그인 상태를 유지하는 방법을 알아보겠다.

 

인증은 보안과 직결돼있기 때문에 조금더 복잡하고, 방어 수단들이 있어야 한다.

 

이번 예제 파일은 4개이다.

1) 로그인 - 사용자가 ID, PW를 입력하는 유저 인터페이스가 위치하고 있는 html 파일

 

2) 인증 - ID와 PW를 입력하고 submit 버튼을 클릭했을 때 데이터가 전송돼서

 그 사람이 맞는지 틀리는지 확인을 하고,

 맞다면 세션에 '이 사람이 로그인했다. 이 사람의 닉네임은 무엇이다.'라고 하는 것을 저장한 다음

 

3) 일반 웹페이지 - 로그인이 되어 있는 상태에서만 접근할 수 있는 웹페이지로

 리다이렉션이라는 기법을 이용해서 사용자를 이동시키는 로직.

 이 웹페이지는 사용자의 닉네임을 세션에서 읽어들여서 그것을 화면에 표시해주는 기능을 갖고 있다.

 

4) 로그아웃 - 사용자의 세션 정보를 삭제해서 로그아웃을 실현하는 기능

 

ID와 PW를 입력하고 submit 버튼을 클릭하면

login_process.php 파일(2번째 예제 = 인증)로 POST 방식으로 이 데이터들이 전송되는 UI이다.

 

 

이 파일은 사용자가 전달한 ID와 PW 값을 받아서

첫 번째로 session_start()를 해서 세션을 초기화한다.

그 다음에 id를 변수로 egoing이라는 값을 저장하고,

pwd를 변수로 codingeverybody라는 값을 저장해놨다.

 

즉 사용자가 전송한 값의 ID와 PW가 이것들과 일치하면

이 사람이 로그인할 수 있는 사용자랑 인증할 수 있는 것이다.

 

그 밑의 로직들은 그것들을 비교하는 조건문이다.

 

이 사람이 사용자이고 로그인이 가능하다고 인증이 되면,

$_SESSION이라는 전역변수를 이용해서 

is_login이라는 값에 true를 주고

nickname에는 이고잉을 적어준다.

 

header는 다음에 설명하고

location은 사용자가 어떤 웹페이지로 왔을 때,

그 페이지에서 이 location이라는 헤더값을 전달해주면

이 location 뒤에 있는 웹페이지/url이 그 쪽으로 사용자를 보내버린다.

(session.php = 3번째 예제로)

이런 것들을 리다이렉션이라고 한다.

 

이 부분은 실행되자마자 로케이션으로 리디렉션시켰기 때문에

이 파일은 우리가 볼 수 없다.

 

마찬가지로 session_start()를 사용해야 하고,

$_SESSION 전역변수를 확인해서 is_login을 확인한다.

is_login이 셋팅되어있지 않다면 이 사람은 로그인에 실패한 것이다.

 

만약 이 사람이 로그인되어 있지 않다면

login.html 파일로 사용자를 보내버린다.

 

그리고 echo를 사용해서 $_SESSION 전역변수에 있는 닉네임값을 출력해준다.

그리고 logout.php라는 링크를 만들었다.

이것을 클릭하면 ↓

 

session_destroy()라는 함수를 호출하면

현재 이 세션에 저장돼있는 모든 세션 데이터가 삭제되면서 세션이 초기화된다.

그리고 로케이션으로 리다이렉션시켜서 

login.html 페이지로 사용자를 보내버린다.

'PHP > 생활코딩' 카테고리의 다른 글

5/29(2) 생활코딩  (0) 2020.05.29
5/29 생활코딩 * xdebug는 리눅스용이라 안봄 * * 뒷부분 안돼서 중단 *  (0) 2020.05.29
5/27(2) 생활코딩  (0) 2020.05.27
5/27 생활코딩  (0) 2020.05.27
5/26 생활코딩  (0) 2020.05.27

댓글