Cookie(쿠키)
상태 정보를 담는 곳
- 웹 응용의 구조
- 웹 클라이언트
- 현재 홈페이지(응용계층) -> HTML 엔진(표현 계층) -> HTTP프로토콜(세션 계층)
- 웹 서버
- 서버응용(로그인, 장바구니) -> 서버 응용 엔진 -> HTTP(세션 계층)
- 웹 클라이언트
- 쿠키란?
- 서버 응용이 클라이언트의 이전 작업 정보(State)를 파악하기 위한 도구
- 방법론
- 기억해야할 사항을 쿠키에 담아 클라이언트가 기억하도록 하고 서버는 클라이언트의 방문시 주는 쿠키 정보에 맞추어 반영한다
- 단점
- 유실되기 쉽다 : 많은 사람들이 쿠키 삭제 방법을 알고 있을텐데 이처럼 누구나 손쉽게 쿠키를 삭제를 할 수 있다는 것은 데이터 유실에 굉장히 큰 단점이 될 수 있다
- 변조가 쉽다 : 개발자의 도구(F12)를 사용한다면 쿠키의 전체적인 상황을 한 눈에 알아보기 편하고 심지어는 그 쿠키를 변경까지도 할 수 있다. 그럼 클라이언트에서 서버에게 보내는 쿠키는 언제든지 꼬일 수 있고 프록시 서버를 이용한다면 변조까지도 가능하다. 그래서 해당 사항은 서버가 쿠키를 검증하는 능력이 필요하다.
- 도난이 쉽다 : 위에 말한것처럼 누구나 접하기 쉬운 쿠키인것처럼 해킹에 또한 쉽게 노출이 될 수 있다. 클라이언트가 뺐기는 쿠키를 서버는 관리해줄수 없다.
- 매 요청마다 같은데이터가 서버로 전송됨에 른 네트워크 대역폭 낭비
- 해결책 : 세션의 사용
- 쿠키 프로토콜
- 쿠키는 기본적으로 <Key>=<Value>의 형태를 가진다
- HTTP Response 헤더 = Set-Cookie ( 서버 => 클라이언트)
- HTTP Request 헤더 = Cookie ( 클라이언트 => 서버)
- 쿠키의 적용 범위
- set-cookie 값 안에 맨 마지막에 Domain = 도메인
- 해당 쿠키의 인지범위를 늘리는것이다.
- set-cookie 값 안에 맨 마지막에 Path = 경로
- 해당 속성(/user)을 포함한 하위 경로를 요청할때만 서버로 돌려보낸다
- set-cookie 값 안에 맨 마지막에 Domain = 도메인
- 쿠키의 보안 속성
- set-cookie 값 안에 맨 마지막에 Secure
- 해당 쿠키는 브라우저가 https프로토콜 상에서만 서버로 돌려보낸다. 이는 네트워크 상에서 탕취되었을 때 문제가 될 수 있는 쿠키를 상대로 사용한다.
- set-cookie 값 안에 맨 마지막에 HttpOnly
- 브라우저에서 자바스크립트로 Document.cookie 객체를 통해 접근할 수 없는 쿠키가 된다.
- set-cookie 값 안에 맨 마지막에 Secure
넘쳐나는 단점이 있는 쿠키를 지금까지 사용하는 이유가 뭘까
위에서 설명한 대로라면 쿠키는 굉장히 좋지 않은 기술이다 라는 생각이 자연스럽게 생길정도로 단점이 많았다 하지만 지금까지 꾸준히 사용하는 이유가 뭘까
이를 알기위해선 HTTP 프로토콜에 대해 알아야 한다. HTTP 프로토콜은 기본적으로 Stateless 라는 특성을 가지고 있다.이러한 특성은 여러 페이지에 걸쳐 흐름이 자연스럽게 이어져야 하는 서비스를 구현하는데 큰 걸림돌로 작용하게 된다.
대부분의 서비스는 수많은 요청을 받게 될것이고 서버는 누가 어떤 요청을 했는지에 대한 판별할 수 있는 능력이 필요하다여기서 쿠키의 중요성이 나타난다.
- 서버는 클라이언트에게 쿠키를 주고 클라이언트는 받은 그 쿠키를 요청이 있을때 마다 헤더에 같이 적어서 보내면 서버는 쿠키를 읽어서 사용자를 판별한다.
그럼 어느 사용자의 요청인지 확실하게 인지 할 수 있고 내가 다시 줘야할 목표도 정확해지는것이다 - 부하 분산
- 서비스의 단위가 크다면 서버를 한대만으로 운영하는것은 굉장히 어렵다고 볼 수 있다. 그렇다면 서버측은 더욱 많은 서버를 만들게 되는데 이때 한쪽으로 쏠리는것을 방지하기 위한 로드 밸런서가 존재한다. 그렇다면 한개의 클라이언트는 여러 서버를 만날텐데 모든 서버는 각자 하는 행위를 저장할 수 없고 알 수 없다. 그래서 데이터를 전송하는데 있어 문제가 생기는 것이다. 그때 처음 연결된 서버가 쿠키값을 준다면 모든 서버는 그 쿠키를 읽을 능력만 있다면 어떤 클라이언트가 온다 할 지라도 쿠키값을 읽고 사용자를 판별할 수 있는 능력을 가지게 되는것이다.
Session(세션)
세션이란
사용자가 웹 브라우저를 통해 웹서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점까지, 같은 사용자로부터 오는 일련의 요청을 하나의 상태로 보고, 그 상태를 일정하게 유지하는 기술
어렵게 설명하자면 이런것이고 간단하게 설명하자면, 방문한 사용자를 기억해두는 기술 이라고 할 수 있다.
세션은 보안이 좋다
세션은 서버에 저장되는 내용이다. 또한 접속이 끊기게 되면 세션ID자체를 서버에서 지워버리기 때문에 보안상 굉장히 안전하다 라고 볼수 있다.
쿠키와 세션은 아예 다른 것일까??
아니다 이 둘은 굉장히 밀접한 관련이 있다. 왜냐하면 서로가 서로를 보완하고 있기때문이다. 상호협력이라고 하는것이 옳바른 판단이라고 봐도 좋다
여기서 기본적인 흐름을 보자
- 클라이언트가 어떠한 서비스에 로그인을 하면서 서버에게 정보를 전달한다
- 서버는 정보를 받아서 DB를 조회하고 세션을 생성한다. 세션은 사용자의 내용을 암호화하여 서버에 저장한다
- 자. 그럼 이제 로그인이 됐다 그럼 다음 행동을 하고 싶은데 기본적인 HTTP 프로토콜이 Stateless라서 연결이 끊겼다. 그럼 로그인은 해제가 되고 나는 모든 페이지를 일일히 로그인하면서 돌아다니는 사람이 된것이다.
- 이때 쿠키의 중요성이 생긴다. 쿠키를 둠으로써 쿠키에 세션내용을 저장해서 클라이언트에게 전송하는것이다.
- 그럼 클라이언트는 세션아이디를 제공받게 되고 그것을 이용해서 서버와 대화하는 것이다.
'CS' 카테고리의 다른 글
DNS(Domain Name System) (0) | 2023.05.03 |
---|---|
HTTP(3). 성능향상 (0) | 2023.05.01 |
HTTP(1). GET & POST (0) | 2023.04.27 |
응용계층(1.프로세스의 통신) (0) | 2023.04.25 |
전송계층 - Reliable Networking ( End - To - End ) (0) | 2023.03.21 |