세션과 쿠키에 대하여 알아보자

2017. 7. 31. 16:03다시 하자 Back-End/Python

반응형

1. 세션과 쿠키



세션과 쿠키는 네트워크 망에서 서버와 클라이언트가 상호간 통신을 할 때 사용하는 수단을 말한다. 이 기술들의 목적은 "상태 유지" 에 있다. 웹 환경에서 사용되는 HTTP 프로토콜은 서버와 클라이언트가 통신을 완료하면 연결을 끊어버린다. 한번의 통신에 요청과 응답을 하나로 묶고 연결을 끊어버리는 프로토콜을 무상태 프로토콜 (Stateless Protocol) 이라고 한다. 





그림 1. HTTP 프로토콜 한번의 싸이클



무상태 프로토콜의 장점은 구조가 간단하여 시스템을 구축하기 쉽고 통신을 하면서 사용되는 수많은 리소스를 절약할 수 있다는 장점이 있다. 무상태 프로토콜의 가장 대표적인 프로토콜은 HTTP이며 주 목적은 웹 상에서 HTML 문서를 서빙하는 것이다.


하지만 웹 상에서도 서버와 클라이언트의 상태 값이 필요한 경우가 있다. 예를 들어 인증 (authentication) 기능을 구현한다고 가정해보자. 인증기능이 필요한 웹 사이트는 클라이언트의 인증 과정을 위해 "Login" 기능을 수행한다. 클라이언트는 서버에서 요구하는 인증에 필요한 정보들을 전달하고 서버는 요청된 정보들을 가지고 올바른 정보인지 확인작업을 수행한다. 확인이 완료되면 서버는 클라이언트에게 인증 되었음을 알리고 클라이언트는 자유롭게 서버의 리소스를 사용한다.


여기서 문제가 되는 것은 수많은 클라이언트의 요청 중, 어떤 클라이언트가 인증을 완료 했는지 판단할 수 있어야 하는데 일반적인 웹 환경에서는 상태 값을 저장하지 않으므로 서버에서 상태를 확인할 수 있는 방법이 없다. 따라서 상태 값을 저장할 수 있는 다른 방법이 필요하며 클라이언트에 정보를 파일로 남기는 것을 "쿠키" 라고 하고 서버에서 별도로 저장하는 것을 "세션" 이라고 한다.


세션과 쿠키는 하는일과 목적은 같지만 저장하는 위치가 다르므로 약간의 차이점을 가진다. 아래는 세션과 쿠키의 차이점을 나타낸 것이다.



 

 세션

쿠키 

 저장 위치

서버의 저장 공간 (Ex. DB, 메모리 등) 

 클라이언트 저장장치

 크기 제한

서버의 리소스가 허용되는 범위 

쿠키 한 개 4KB, 최대 300개 저장

 저장 타입

객체

텍스트 

 소멸 시점

설정에 따라 다름

기본값은 브라우저 종료 시 소멸

쿠키 갱신 시 소멸 / 브라우저 종료 시

리소스 사용 

서버의 리소스 활용 

클라이언트의 리소스 활용 



세션을 사용하여 인증하는 방법은 아래와 같다.







그림 2. 세션을 통한 인증방식




1) 클라이언트가 서버에게 Login을 요청한다. 이 때, 인증에 필요한 정보를 파라미터로 전달한다.


2) 서버에서는 전달된 정보가 맞는지 확인 작업을 수행한다. 정보가 올바르다면 세션 객체를 생성하고 세션 ID를 Set-cookie 를 통하여 클라이언트에게 전달한다. 세션 객체는 서버에 저장되며 일반적으로 메모리나 Cache DB에 저장한다.


3) 클라이언트가 서버에게 작업을 요청할 때 HTTP Request 헤더에 세션 ID를 같이 전달한다.


4) 서버에서는 클라이언트의 세션정보에 세션 ID가 있다면, 세션 스토리지에서 세션 객체를 검색한다. 정보가 있으면 요청한 작업에 대해 응답해주고 통신이 종료된다.



여기서 중요한 점은 세션 ID를 클라이언트에 전달할 때 쿠키를 이용한다는 점이다. 몰론 쿠키를 저장수단으로 활용하는 것이 아니라, 전달수단으로 사용한다는 점이 다르다. 클라이언트 인증 시 필요한 정보들을 파일로 따로 저장하지 않기 때문에 쿠키를 저장수단으로 사용하는 것보다 훨씬 안전한 방식이다. 따라서 보안성이 요구되는 인증방식에 매우 적합하다고 볼 수 있다.


쿠키의 인증 방법은 위와 다르지 않지만, 사용자가 인증에 필요한 데이터들이 쿠키 파일에 담겨 있다는 것이 다르다. 문제는 쿠키 파일은 3자가 파일을 열어볼 수 있다는 것이다. 세션 ID의 경우 일반적으로 아무 의미없는 겹치지 않는 랜덤 문자열로 ID를 생성하기 때문에 분석 자체가 의미가 없다. 하지만 쿠키는 중요한 정보들이 저장되기 때문에 탈취되어 데이터가 누출되면 보안사고가 일어날 가능성이 높다.


심지어 쿠키는 자바스크립트에서 호출할 수 있으며 스크립트를 이용하는 XSS 공격에 취약하기 때문에 각별히 신경써야한다. 최근에는 워낙 많이 알려지다보니 자바스크립트에서 쿠키를 불러올 수 없도록 옵션도 제공하고 SSL에서만 전송목적으로 사용할 수 있도록 설정하기도 한다.


위의 글만 보면 세션은 완벽한 기술로 보이지만 세션도 몇 가지 문제점을 가지고 있다.


첫 번째로, 서버의 리소스를 많이 사용한다는 점이다. 많은 수의 클라이언트가 인증과정을 거치게 되면 많은 수의 세션 객체가 서버에 저장된다. 일반적으로 많이 사용하는 Cache DB인 Redis DB의 경우 파일로 저장하는 것이 아닌 메모리에 저장하기 때문에 수많은 요청이 들어올 경우 서버의 메모리 점유율이 높아진다. 즉, 서버에 부하가 걸리며 이는 안전성을 위협할 수 있다. 쿠키의 경우 따로 정보를 서버에 저장하지 않기 때문에 서버의 부담감이 상대적으로 적다.


두 번째로, 세션의 파괴 시점이 분명하지 않다. 일반적인 세션은 브라우저가 종료될 때 같이 소멸한다. 하지만 세션 정보에 Permanent 속성 값을 주고 유효기간을 설정하는 경우에는 브라우저가 종료되도 세션이 유지되는데 이것을 영구세션이라고 한다. 따라서 의도치 않게 세션이 지속적으로 유지될 수 있다. 개발자가 영구세션을 사용한다면 각별한 주의가 필요하다. 이 항목은 단점이라기 보다는 주의사항으로 보는 것이 맞겠다.



2. 쿠키 vs Local Storage



그렇다면 쿠키는 현재 사용하기에는 너무 위험하고 구닥다리(?) 기술이 아닌가라고 생각할 수도 있다. 또한 자바스크립트를 좋아하는 개발자들이라면 ECMA 2015에서 추가된 Local Storage와도 비교할 수 있을 것이다. 아래의 그림은 쿠키와 Local Storage를 비교한 그림이다.



그림 3. Cookie vs Local Storage



표에서 보면 사용하는 용도가 극명하게 갈리는 것으로 볼 수 있다. 쿠키는 서버로부터 전달받은 데이터를 저장하고 전달하는 것을 목적으로 한다면 Local Storage는 클라이언트의 페이지에서 일어나는 상태나 데이터들을 저장하는 것을 목적으로 한다. 즉, Local Storage는 서버와는 전혀 관계가 없다.


보안에 관련된 기능들을 Local Storage에 저장하는 행위도 큰 문제를 발생시킬 수 있다. 쿠키는 자바스크립트에서 접근할 수 없는 httponly 옵션과 SSL에서 전송 수단으로만 사용할 수 있도록 하는 secure 속성 등을 제공하며 브라우저가 종료될 때 파기된다. 그러나 Local Storage는 사용자가 삭제하기 전까지는 데이터가 소멸되지 않는다. Session Storage 라는 것도 있지만 브라우저가 종료될 때 파기되는 것 외에는 차이점이 없다.


대신 Local Storage는 클라이언트에서만 보면 매우 유용하다. 데이터가 소멸되지 않기 때문에 서버와 관련된 데이터 외에 나머지 데이터를 저장할 때 유용하고 내부적으로 브라우저 엔진을 사용하므로 속도도 빠르다. (ReactJS에서 나름 유용하게 사용하였다.) 용도에 맞게 적절히 활용하면 매우 편리한 도구가 될 수 있다. 단 보안에 관련된 정보를 담기에는 위험요소가 많으므로 주의해서 사용하자.



3. 결론



세션



- 인증된 클라이언트의 정보를 서버에서 내부적으로 저장하고 관리하는 방식이다.


- 서버의 자원이 남아있으면 제한없이 정보를 저장할 수 있으며, 객체로 관리되기 때문에 다양한 정보를 저장할 수 있다.


- 클라이언트에게 세션쿠키를 이용하여 세션 ID를 전달하며, 클라이언트는 세션 ID를 Request에 포함하여 전송한다.


- 클라이언트의 중요한 정보가 아닌 세션 ID만 클라이언트에게 넘겨주기 때문에 쿠키보다 안전하다. 세션 ID는 자체적으로 별 의미가 없다.


- 많은 수의 세션이 서버에 저장될 경우 부하가 올 수 있으며, 세션의 종류에 따라 파기시점이 다르기 때문에 개발할 때 주의해야 한다.



쿠키



- 의미있는 데이터를 클라이언트 위치에 특정 경로에 파일로 저장하는 방식이다.


- 요청 때마다 쿠키 정보를 클라이언트에게 전달하는 방식으로 서버가 클라이언트의 상태를 내부적으로 저장하지 않기 때문에 서버의 부하가 적다.


- 클라이언트의 저장장치에 파일로 저장되기 때문에 제 3자가 데이터를 쉽게 탈취할 수 있다. 이런 이유로 쿠키에 데이터를 저장 할 때 암호화를 하는 등의 추가적인 작업이 요구된다.


- 쿠키 파일당 4KB, 최대 300개의 파일을 저장할 수 있다.


- 자바스크립트에서 접근이 가능하기 때문에 공격자가 스크립트를 이용하여 쿠키를 탈취할 수 있다. (XSS 공격에 취약하다.)



공통점



- 웹 상에서 서버와 클라이언트간의 상태 값을 저장하고자 할 때 사용한다.

반응형