일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- hackerrank
- continue 사용법
- 입출력
- spring security
- 붕대 감기
- 프로그래머스
- java
- 티스토리챌린지
- 오버로딩
- 혼공얄코
- 객체지향
- 다형성
- 자바의 정석
- 자바의정석
- 쿠키
- 프로그래머스 붕대 감기
- contiune
- 멀티태스킹
- 오버라이딩
- 중첩 break
- over()
- SQL Mapper
- 오블완
- spring security 설정
- CPU
- 캡슐화
- break 사용법
- 붕대 감기 자바
- 멀티프로세싱
- 리눅스
- Today
- Total
쉽게 쉽게
쿠키, 세션, 토큰, 캐시 본문
'혼자 공부하는 얄팍한 코딩 지식'을 읽으며 추가적으로 공부한 내용을 정리한 글입니다.
1. 쿠키와 세션을 사용하는 이유
웹 사이트를 이용할 때, HTTP 프로토콜은 클라이언트가 요청(Request)을 서버에 보내고, 서버는 클라이언트에게 적절한 응답(Response)을 주고 연결(Connection)을 끊는 특성이 있다.
이를 비연결지향(Connectionless) 특성이라 한다.
또한 커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다.
이를 상태 없음(Stateless) 특성이라 한다.
(한마디로 연결이 종료되면 원상태로 리셋!)
비연결지향이라는 특성 덕분에 커넥션을 유지하지 않기 때문에 서버 리소스 낭비가 줄어드는 것은 장점이지만,
연결정보가 없다는 것은 통신하고 있는 주체가 누구고 언제부터 통신했는지를 알 수 없다는 의미가 된다.
즉 연결 정보가 없다면, 현재 인터넷에서 우리가 사용하는 것과 같은 연속적인 통신이 어렵다는 의미다.
만약 쿠키와 세션없이 쇼핑몰을 이용한다면 옷을 구매하려고 로그인을 했음에도, 페이지를 이동할 때마다 계속 로그인을 해야 하는 상황이 발생한다.
또한 통신할 때마다 계속 다시 연결을 시도한다면, 서버에 불필요한 연산작업이 늘어나게 되어 서버의 성능 저하 또는 통신 장애로 이어질 수 있다.
때문에 이를 극복하고자 쿠키와 세션을 사용하고 있다.
2. 쿠키
쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
쿠키는 제 3자가 조회하는 것도 가능하기 때문에 개인 정보나 보안에 민감한 정보를 저장하는 데 적합하지 않다.
웹 사이트를 이용하면서 이전에 '자동로그인, 입력했던 검색어들을 찾아보거나, 팝업 7일 동안 보지 않기' 등과 같은 기능이 쿠키를 활용한 것들이다.
★ 쿠키의 특징
쿠키는 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다.
쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조한다.
클라이언트에 300개까지 쿠키저장 가능하다.
하나의 도메인당 20개의 값만 가질 수 있다.
하나의 쿠키값은 4KB까지 저장한다.
Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송한다.
★ 쿠키의 구성 요소
이름 : 각각의 쿠키를 구별하는 데 사용되는 이름
값 : 쿠키의 이름과 관련된 값
유효시간 : 쿠키의 유지시간
Expires : 만료일이 되면 쿠키를 삭제한다.
예 ) Set-Cookie: expires=Sat, 26-Mar-2023 10:09:20 GMT
max-age : 쿠키의 최대 시간을 나타낸다. 0이나 마이너스로 나타내면 쿠키는 삭제된.
예 ) Set-Cookie: max-age=3600 (3600초)
도메인 : 쿠키를 전송할 도메인
Domain : 명시한 도메인을 나타낸다.
이 값이 현재 탐색 중인 도메인과 일치하지 않을 경우, "타사 쿠키"로 간주되며 브라우저에서 거부한다.
예 ) domain=.google.com;
경로 : 쿠키를 전송할 요청 경로
path : 이 경로를 포함한 하위 경로 페이지만 쿠키가 접근된다. 일반적으로 루트(/)로 지정한다.
도메인의 루트 경로로 이동할 경우 쿠키가 전송된다.
예 ) path=/;
★ 쿠키의 동작 방식
- 클라이언트가 페이지를 요청
- 서버에서 쿠키를 생성
- HTTP 헤더에 쿠키를 포함시켜 응답
- 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
- 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
- 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
★ 쿠키의 종류
Session Cookie | 보통 만료시간(Expire date)를 설정하고 메모리에만 저장되며 브라우저 종료시 쿠키를 삭제. |
Persistent Cookie | 장기간 유지되는 쿠키, 파일로 저장되어 브라우저 종료와 관계없이 사용. |
Secure Cookie | HTTPS에서만 사용, 쿠키 정보가 암호화 되어 전송. |
3. 세션
사용자가 이미 서버로부터 인증받았음을 증명해 주는 것이 세션이다.
웹사이트에 아이디와 비밀번호를 입력하여 로그인하면 해당 사이트의 회원 기능을 사용할 수 있게 된다.
그러나 위에 언급했듯이 서버는 이미 로그인한 사용자를 알아보지 못하는 특성을 가졌기 때문에 이미 로그인에 성공했던 사용자임을 나타내기 위해 세션 아이디라는 데이터를 만든다.(ex. JSESSIONID)
사용자는 서버로부터 받은 세션 아이디를 쿠키로 저장하고 앞으로의 요청에 함께 전달하게 된다.
그리고 서버는 세션 아이디를 확인하고 서버가 보관하고 있는 세션 아이디 중 일치하는 정보가 있는지 확인 후 동작한다.
이처럼 세션은 로그인 여부 등 사용자와 서버의 관계가 기억되어 보존되고 있는 상태를 말한다.
정리하면 세션이란 일정 시간 동안 같은 사용자(브라우저)로 부터 들어오는
일련의 요청을 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다.
또한 여기서 일정 시간이란 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료함으로써 연결을 끝내는 시점을 말하며 즉, 방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라고 칭한다.
★ 쿠키와 세션의 차이점
(1) 저장 위치
쿠키는 클라이언트(브라우저)에 메모리 또는 파일에 저장하고, 세션은 서버 메모리에 저장된다.
(2) 보안
쿠키는 클라이언트 로컬(local)에 저장되기도 하고 특히 파일로 저장되는 경우 탈취, 변조될 위험이 있고, Request/Response에서 스니핑 당할 위험이 있어 보안이 비교적 취약하다.
반대로 Session은 클라이언트 정보 자체는 서버에 저장되어 있으므로 비교적 안전하다.
(3) 라이프 사이클
지속 쿠키의 경우에 브라우저를 종료하더라도 저장되어 있을 수 있는 반면에 세션은 서버에서 만료시간/날짜를 정해서 지워버릴 수 있기도 하고 세션 쿠키에 세션 아이디를 정한 경우, 브라우저 종료 시 세션아이디가 날아갈 수 있다.
(4) 속도
쿠키에 정보가 있기 때문에 쿠키에 정보가 있기 때문에 서버에 요청 시 헤더를 바로 참조하면 되므로 속도에서 유리하지만, 세션은 제공받은 세션아이디(Key)를 이용해서 서버에서 다시 데이터를 참조해야 하므로 속도가 비교적 느릴 수 있다.
4. 토큰
세션 방식은 안전하고 효과적이지만 서버는 요청마다 딸려오는 세션 아이디를 계속해서 확인해야 하기 때문에 서버에 동시 접속하는 사용자가 많아지면 메모리 공간이 부족해져서 서버에 부하가 걸리는 현상이 나타날 수 있다.
이를 극복하기 위한 방법으로 나타난 것이 토큰을 발급하는 것이다.
로그인한 사용자에게 토큰을 생성해 주고 이를 쿠키로 저장해 두게 된다.
그리고 요청이 있을 때마다 발급받은 토큰을 제시하여 사용자의 요청을 허용해 주는 방식이다.
계속해서 세션아이디를 비교하며 사용자의 상태를 체크하는 세션과는 달리 토큰만 확인하면 되기에 부하를 줄일 수 있다.
★ 토큰의 동작방식
1. 사용자가 서버에 로그인한다.
2. 서버가 로그인 정보를 받아서 토큰을 만든다.
3. 사용자는 브라우저에서 토큰을 받아 임시저장한다.
4. 사용자가 토큰과 함께 서버에 요청을 보낸다.
5. 서버는 자신이 만든 토큰이 맞는지 확인하고, 토큰이 맞는 경우에만 올바른 응답을 보내준다.
다만 한 번 발행한 토큰은 유효기간이 끝나기 전까지 따로 통제할 수 없어 세션에 비해 토큰 정보를 탈취당할 가능성이 높다는 단점이 있다.
이를 극복하기 위해 만료 기간을 짧게 지정해 피해를 줄이는 방식을 택하고 있다.
5. 캐시
웹 사이트에서 이미지, 동영상 등의 대량의 데이터를 서버로부터 전송받는다.
이러한 데이터 전송은 시간이 소요되고 비용이 발생하기도 한다.
때문에 한 번 전송받은 데이터는 저장해 놨다가 다시 꺼내서 사용하는 캐시를 이용한다.
(원래 데이터를 접근하는 시간이 오래 걸리는 경우(서버의 균일한 API 데이터)나
반복적으로 동일한 결과를 돌려주는 경우(이미지나 썸네일 등)에 사용)
결국 Cache란 반복적으로 데이터를 불러오는 경우에, 지속적으로 DBMS 혹은 서버에 요청하는 것이 아니라 Memory에 데이터를 저장하였다가 불러다 쓰는 것을 의미한다.
캐시는 저장공간이 작기 때문에, 지속적으로 Cache Miss가 발생하는 데이터의 경우 캐시 전략에 따라서 저장 중인 데이터를 변경해야 한다.
쿠키와 캐시는 모두 정보를 저장하여 재활용하지만, 쿠키는 사용자의 수고를 덜어주는 데 목적을 두고, 캐시는 데이터의 전송량을 줄이고 서비스 이용 속도를 높이는 데 목적을 둔다.
참고한 글입니다.
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |
'CS > CS' 카테고리의 다른 글
컴퓨터 구성요소 (0) | 2023.05.07 |
---|---|
XML, JSON (0) | 2023.04.05 |
API, REST, REST API (0) | 2023.04.01 |
서버 서비스 구조와 관련 용어 (0) | 2023.03.15 |
BOM과 DOM이란? (0) | 2023.03.14 |