티스토리 뷰
1. 쿠키
쿠키의 등장이유
HTTP는 Stateless(무상태) 프로토콜이다. 즉, 상태정보를 가지고 있지 않는 통신방법이다. Http는 단순하다. 요청하고 그 요청에 대한 응답을 받는다.
만약 로그인을 하고, 다음 http 통신을 요청한다면 무상태 프로토콜은 로그인 정보(상태)를 가지지 않으므로 로그인을 했는지 여부를 알 수 없다. 따라서 로그인 했음을 알려주려면 로그인에 대한 정보를 지속적으로 알려주어야 한다.
- URL 뒤에 로그인 정보를 쿼리문으로 붙여준다면?
// 가상예시
https://github.com/settings/profile?login=ok
브라우저에 직접 입력해서 로그인페이지에 들어갈 수도 있는 문제가 생긴다.
- POST 요청 매개변수로 전달
form의 post 요청 정보를 계속 포함시켜 전달한다. 이렇게 하면 매번 form을 이용해야 하므로 상당히 반복적이고 번거로운 작업이 된다.
http 사용에서 정보유지(상태유지)의 필요성이 생겨났고, 쿠키가 등장하게 되었다.
동작순서
처음에 서버에 로그인 정보를 넘기면, 서버에서는 쿠키를 설정해서 client에게 보내준다. 쿠키저장소에 쿠키가 저장되고 그 이후 서버에 요청할때마다 해당 쿠키를 꺼내 같이 요청하는 방식이다. 이때, 쿠키를 받은 서버와 다른 웹 서버에는 쿠키를 보내지 않는다.
특징
- 개인의 웹 브라우저에 저장 (같은 PC에서 쿠키 정보를 공유하기도함), 파일의 형태로 저장된다.
- key=value 형태로 표현
- 쿠키 정보는 항상 서버에 전송
: 네트워크 트래픽을 추가 유발할 수 있으므로 최소한의 정보만 사용하는 것이 좋다. 서버에 전송될 필요가 없다면 웹 브라우저 내부에 웹 스토리지(localStorage, sessionStorage)를 사용하는 것이 좋다.
- 해당 서버에만 전송하므로 다른 서버라면 그 쿠키는 전송하지 않음
- 4KB 크기만큼 저장 가능하다.
[추가학습] 로컬스토리지와 세션 스토리지
웹 스토리지는 클라이언트에 정보를 저장하며, 로컬스토리지와 세션스토리지로 나뉜다. localStorage는 웹페이지의 세션이 끝나도(브라우저를 닫을 때) 지워지지 않지만 sessionStorage는 웹페이지의 세션이 끝나면 지워진다. 로컬스토리지는 여러 탭이나 창에서 서로 공유된다.
쿠키와는 달리 로컬스토리지는 http 요청마다 서버에 데이터를 보내지 않는다. 따라서 클라이언트와 서버 사이의 트래픽을 줄일 수 있다. 로컬스토리지는 최대 5MB 정보 저장이 가능해서 쿠키보다 더 많은 정보를 저장가능하다.
장점
http의 무상태의 특성을 보완하여 상태정보를 효과적으로 저장하여 데이터를 주고 받을 수 있다.
단점
보안이 취약하다. 보안에 민감한 데이터는 저장하면 안 된다. header를 사용하기 때문에 조금만 지식이 있다면 해당 정보를 쉽게 엿볼 수 있다.
사용방법
- set-cookie
// 깃허브 http header의 일부
set-cookie: user_session=세션ID; path=/; expires=Wed, 10 Mar 2021 23:34:39 GMT; secure; HttpOnly; SameSite=Lax
expires=날짜로 만료일을 지정
max-age=초단위로 만료시간 지정
- 보안
- Secure : https인 경우만 전송
- HttpOnly : 자바스크립트에서 접근 불가, http 전송시에만 사용 (XSS 공격방지)
- SameSite : 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송 (XSRF 공격방지)
사용예시
- 사용자 로그인 세션 관리
- 광고 정보 트래킹
2. 세션
세션의 등장이유
쿠키의 보안상의 이유로 등장하게 된 것이 세션이다. 좀 더 안전하게 많은 정보의 보존이 가능하다. 세션 아이디를 key로 상태정보를 테이블로 관리한다. 클라이언트의 request에 대해 서버가 유일한 세션id를 부여한다.
동작순서
처음 로그인을 하여 서버에 접속하면 sessionID를 발급한다. 이것을 쿠키에 넣어 보내고 클라이언트는 쿠키에 저장한다. 이후 개인 정보는 서버의 세션정보가 있는 테이블에 있고, 쿠키를 통해 접속된 세션 ID로 현 상태정보를 유지한다. 로그인 할 때마다 새로운 세션 아이디가 발급된다. 브라우저가 꺼지면 세션 아이디도 없어진다.
특징
- 서버에 저장
- 다른 브라우저에서 로그인하면 별개의 클라이언트로 인식하여 다른 sessionID를 발행
- 로그아웃시 세션ID는 무효가 되며 로그인 마다 새롭게 할당
장점
쿠키보다 보안에서 유리하다.
단점
서버의 자원을 사용한다. 사용자가 많아지면 서버의 리소스가 많이 소요된다. 쿠키보다 속도가 느린 편이다.
사용예시
- 개인정보
비교
쿠키와 세션은 http의 상태를 저장하지 않는 특성에 대해 상태정보를 유지하기 위해서 사용된다.
쿠키 | 세션 | |
저장위치 | 웹 클라이언트(브라우저) | 서버 |
라이프 사이클 | 브라우저가 종료되어도 쿠키만료 시간까지 저장 | 브라우저가 종료되면 만료됨 |
보안 | 취약 | 보다 유리 |
정리
쿠키와 세션이 혼합되어 사용된다. 쿠키는 세션ID 정도를 보관하고, 필요한 개인정보들은 세션ID를 통해 테이블에서 가져온다. 로그인 할 때마다, 새로운 세션ID로 관리하긴 하지만, 계속 로그인 되어있는 상태에서 쿠키에서 세션ID가 유출되면 개인정보가 유출될 수도 있는 것 같다. 최근에는 서버에서 토큰을 발급받는 토큰기반 인증을 많이 한다고 한다.
참고
프로가 되기 위한 웹 기술 입문(책)
모두를 위한 http (인프런 강의)
'Computer Science > 네트워크' 카테고리의 다른 글
[스터디] 성공과 실패를 결정하는 1%의 네트워크 원리 (0) | 2021.07.27 |
---|---|
토큰 인증방식(+ 쿠키와 세션 추가내용) (0) | 2021.03.09 |
네트워크 시리즈(마지막) 7. HTTPS (0) | 2021.01.30 |
네트워크 시리즈 6. 캐시 관련된 HTTP 헤더 (0) | 2021.01.30 |
네트워크 시리즈 5. HTTP 헤더 기본 (0) | 2021.01.29 |
- Total
- Today
- Yesterday
- 카카오
- java
- python
- DB
- JPA
- Spring
- 객체지향
- JS
- Transaction
- 인증
- 회고
- 네트워크
- 모의면접준비
- 내부코드
- 코드스쿼드
- TIL
- 알고리즘
- 마스터즈코스
- OS
- 운영체제
- 월간회고
- javascript
- 개발공부일지
- 우아한테크코스
- React
- CS
- TCP/IP
- 학습로그
- 글쓰기미션
- 우테코수업
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |