쿠키, 세션, 캐시 어떤 차이점이 있는걸까?

2016.06.02 13:44
저자 : Kurien

웹개발을 하다보면 간혹 이런 상황이 발생합니다.

"쿠키? 세션? 캐시? 이런건 무엇이고, 어떻게 다른건가요?"


초보 개발자 분들은 대부분 위의 세 항목이 어떤 역할을 하는지, 어떻게 사용해야하는지 몰라서 헤메곤 합니다.

물론 저도 완벽히 알지는 않지만, 적어도 어떤 용도로 사용되는지는 알고 있다고 생각해서, 설명드려보려 합니다.


먼저 간단하게 설명을 드리겠습니다.

쿠키를 설명 해보죠.

PHP 기준으로 설명드리자면 $_COOKIE['변수명'] 을 통해 불러올 수 있고, setcookie() 함수를 통해서 저장이 가능한데요.


이 쿠키는 "사용자의 브라우저"에 저장이 됩니다.

그리고 사용자의 컴퓨터를 만질 수 있다면 누구라도 쿠키에 입력된 값을 확인할 수 있습니다.

이 말은 "보안성이 없다"라는거죠.


두번째는 세션입니다.

세션의 경우 "서버에 저장되는 쿠키"라고 이해하시면 편합니다.

세션은 $_SESSION['변수명']을 통해 불러올 수 있고, 저장도 가능합니다.


하는 기능은 쿠키와 크게 다르지 않지만, 서버에 저장되고, 서버에 직접 접근하지 않는 이상 세션 내의 데이터를 탈취하는 것은 어렵다고 보시면 됩니다.


세번째는 캐시입니다.

캐시의 경우 쿠키, 세션과는 전혀 다른 기능을 가지는데요.


홈페이지를 접속하면 css, js, 이미지 파일이 사용자의 브라우저에 저장이 됩니다.

그 후 다시 같은 홈페이지를 접속하게 되면 css, js, 이미지 파일을 서버가 아닌 사용자의 PC에서 가져오게 됩니다.


이렇게 저장된 데이터를 캐시되었다고 합니다.


이로써 얻는 이점은 css, js, 이미지의 용량이 3MB라고 가정할 때, 서버는 한번 요청될 때마다 3MB의 자원을 아끼는거죠.

대부분의 홈페이지는 상단, 하단이 동일하므로 더욱 더 많은 자원이 아껴지는겁니다.


이로써 발생하는 문제가 있는데요.

홈페이지 관리자가 이미지를 변경 -> 사용자는 이미지가 변경되어있지 않음.


위와 같은 상황이 발생할 수 있습니다.

이러한 경우도 브라우저에 이미 캐시되어있는 경우 발생하는 문제죠.


해결 방법은 사용자 브라우저의 캐시를 지워주거나, 서버에서 클라이언트로 응답을 보낼 때 header에 캐시 만료시간을 명시해주는 등 방법은 다양합니다.



간단한 설명은 여기까지구요, 쿠키와 세션에 대해서 더 알아보겠습니다.


쿠키의 경우 위에서 보안성이 없다고 했는데요.

기본적으로 모든 브라우저의 쿠키는 쉽게 열람이 가능합니다.


이전의 웹 사이트에서는 자동 로그인 기능을 제작할 때 쿠키에 아이디와 비번을 넣어놓고 쿠키가 있다면 자동 로그인 되게끔 만든적이 있어서 보안적으로 문제가 됐었던 적이 있죠.


쿠키는 보안적인 부분은 없으므로 "절대로" 중요 데이터가 입력되어선 안됩니다.

쿠키를 사용하는 대표적인 기능은 쇼핑몰의 장바구니가 있겠네요.


크게 중요한 데이터도 아니면서, 한번 쓰고 버리는 데이터니까요.


그리고 쿠키의 중요한 기능이 하나 더 있는데요.

이 부분은 세션을 설명하면서 함께 말씀드리겠습니다.


세션의 경우 위의 쿠키에서 저장하지 않는 "중요한 데이터"를 저장할 때 주로 쓰입니다.

회원이 로그인 했을 때 로그인 된 아이디나, 개인정보 등 사용자에게 보여져선 안되는 정보를 담고 있죠.


그리고 세션은 쿠키와 밀접한 관계가 있는데요.

서버는 사용자 하나하나를 인식할 수가 없습니다.


이 말은 사용자1, 사용자2가 있을 때 사용자1이 로그인 했더라도 "로그인한게 사용자1 이다"라는 것을 알 수 없습니다.

하지만 정상적으로 로그인 되는 이유는 쿠키와 세션의 연결에 의해서입니다.


사용자가 처음 웹에 접속하게 되면 서버는 세션을 하나 생성하고, 세션에 해당하는 쿠키를 사용자에게 생성합니다.

이 쿠키는 사용자가 웹 페이지를 접속할 때마다 서버에 보내지게 되는데요.


서버는 이 쿠키의 값을 가지고 해당 세션이 있는지 검사한 뒤, 세션이 있다면 "이 사람이 사용자1이다."라고 판단하게 되는겁니다

그래서 대부분의 웹사이트를 들어가서 쿠키를 확인해보면 PHP의 경우 PHPSESSID, JSP의 경우 JSESSIONID 등이 있습니다.


변수명은 변경할 수 있기 때문에 티스토리 블로그의 경우엔 TSSESSION으로 변경해뒀네요.

그리고 이 세션 ID는 보안상의 취약점이 있습니다.


만약 제가 로그인 되어있는 동안 "TSSESSION"의 값을 누군가가 알아내서 자신의 TSSESSION 값을 제 TSSESSION 값으로 변경해버리면 그 누군가는 제 아이디로 로그인 되어버립니다.


이를 이용한 해킹 방법을 세션 탈취, SESSION HIJACKING이라고 하죠.

홈페이지 관리자의 세션 아이디를 알아내어 자신의 세션 아이디를 해당 값으로 변경하면 되는 방법입니다.


막는 방법은 여러가지 있겠지만, 제가 아는 방법 하나는 세션에 로그인 했을 때의 아이피를 저장해두고, 페이지 이동시 마다 현재 아이피와 세션에 저장된 아이피와 브라우저 정보(UserAgent)가 같은지 검사하는 방법입니다.


이런 것도 같은 아이피 내에서 같은 브라우저로 공격한다면 소용 없겠지만, 어느정도의 피해는 막을 수 있을껍니다.


여기까지 쿠키, 세션, 캐시에 대해 알아보았습니다.

저작자 표시 비영리 변경 금지
신고

'Web Programming' 카테고리의 다른 글

쿠키, 세션, 캐시 어떤 차이점이 있는걸까?  (9) 2016.06.02