오늘은 쿠키와 세션에 대해서 알아보도록 하자!
웹 진단을 하다보면 가장 많이 들어보는 말이 쿠키변조 또는 세션ID 추측이다.
하지만 쿠키와 세션이란 무엇일까? 오늘 한번 알아보자
먼저 쿠키와 세션을 알려면 HTTP의 특징부터 알아야한다!!
HTTP(HyperText Transfer Protocol)란?
주로 HTML 문서를 통해 데이터를 주고 받는 형태를 뜻하며, 일반적으로 TCP 프로토콜을 사용한다.
클라이언트와 서버의 구조로 동작한다. 일반적으로 클라이언트라고 하면 사용자 브라우저를 뜻하고
서버는 클라이언트의 요청을 처리하는 웹/WAS 서버가 된다.
HTTP의 가장 큰 약점은 비연결지향(Connectionless), 상태정보 처리 안함(Stateless)이다.
비연결지향(Connectionless)란?
HTTP는 비연결지향의 성질을 가지고 있다.
즉 클라이언트가 요청을 하고 서버가 이에 대한 응답을 한 이후에 해당 연결을 끊는 성질을 뜻한다.
HTTP 설계 초기에는 대용량의 데이터를 주고 받는 일 또는 실시간으로 데이터 처리에 대한 개념이 적었기 때문에
데이터 송/수신을 일회성으로 간주하였기 때문에 불필요한 연결을 지향하기 위해 비연결지향 성격을 가지게 되었다.
하지만 오늘날에는 데이터 송수신이 워낙 빈번하게 일어나기 때문에 요청 -> 응답 -> 연결 종료 -> 재연결 과정이 많고,
이때마다 종료, 연결에 많은 자원이 할당되어 비효율적이므로 연결을 유지하도록 하는 설정이 필요하다.
오늘날에는 HTTP 1.1에서는 연결을 유지하는 기능이 Default으로 추가 되었다.(keep-alive값으로 변경 가능)
즉, 클라이언트 또는 서버가 임의로 연결을 끊기 이전에는 해당 연결을 통해서 계속해서 데이터 송/수신이 가능하다.
- 그렇기때문에 방화벽의 통신방향에서는 클라이언트 단방향 정책이 필요한지, 양방향 정책이 필요한지 사전에 확인이 필요하다.
상태정보 처리 안함(Stateless)란?
말 그대로 첫번째 연결에서의 클라이언트 상태값을 두번째 등 그 이후의 연결에서는 전혀 유지하지 않는 성질이다.
이것 또한, 위와 마찬가지로 초기 설계단계에서는 빈번하게 데이터 송/수신이 발생하지 않을 것으로 판단하였기 때문에 가지는 성질을 뜻한다.
그리고 이러한 성격을 보완하기 위해 쿠키(Cookie)와 세션(Session) 설정이 생겨났다.
쿠키와 세션을 간단하게 말하면 클라이언트의 상태값을 뜻한다. 로그인을 할 경우 어떤 ID로 로그인을 했는지, 관리자인지/일반 사용자인지 구분하기 위한 값이다.
만약, 쿠키와 세션이 없었다면 우리가 쇼핑몰에 들어가서 쇼핑을 할 경우 처음에 로그인을 하고 각 쇼핑 페이지마다 매번 로그인을 해야한다! 왜냐? 두번째 페이지에서는 내 브라우저에 대한 정보가 없으므로
그렇다면 쿠키(Cookie)와 세션(Session)의 차이는 무엇일까?
1. 저장 공간의 차이
- 쿠키는 정보를 클라이언트에 저장하는 반면
- 세션은 서버에 저장한다.
2. 속도의 차이
- 쿠키는 클라이언트 파일을 읽어서 처리하기에 속도가 빠르지만
- 세션은 서버에 전달하여 서버에서 처리하기에 시간이 오래 걸린다.
3. 보안성
- 쿠키는 클라이언트에 정보를 저장하는 만큼 탈취등의 문제가 발생할 수 있어 상대적으로 세션보다 보안성이 취약하다.
4. 인증 유효기간
- 쿠키는 사용자 유효기간을 명시적으로 정할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되더라도 인증이 유지 된다.
-반면에 세션은 서버에 사용자 정보를 저장하고 클라이언트에는 세션ID만 전달하기 때문에 브라우저가 종료되면 인증이 종료 된다.
쿠키와 세션은 유사한 기능을 가진 설정이지만, 보안성, 속도, 유효기간 등등에서 일부 차이점이 보인다.
물론 쿠키가 더 좋다. 세션이 더 좋다. 할 수는 없다. 각 상황 및 서비스에 맞는 방법을 채택하면 된다!!
'기본 이모저모' 카테고리의 다른 글
[Swap] Swap Memory 할당 임시 방편 (0) | 2022.03.05 |
---|---|
OWASP TOP10 (0) | 2021.10.28 |
웹이란? (0) | 2021.10.02 |
크롬 확장 프로그램!! 프록시 간편하게 잡기 (0) | 2021.08.07 |
php_ascii 코드 (0) | 2021.02.21 |