1일 1개념정리 24.08.09.금 ~
큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.
무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#52. 쿠키와 세션
요즘 토큰, 세션테이블 이런 쪽을 공부하고 있다. 그럼 쿠키와 세션에 대해서도 알아보자. 예전에 쿠키와 캐시에 대해서 정리한 것도 있는데 참고해보자.
https://100won-developer.tistory.com/entry/%EC%BF%A0%ED%82%A4%EC%99%80-%EC%BA%90%EC%8B%9C
우테코 디투님의 강의를 참고하였습니다.
https://www.youtube.com/watch?v=XgcCkcKGbys&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=186
쿠키
쿠키는 "브라우저에 저장"되는 작은 데이터 파일이다. (브라우저에 저장 = 클라이언트에 저장) 이 데이터 파일에는 사이트에 방문한 이력이나, 검색 기록, 로그인 상태 등을 저장할 수 있다. 아 그리고 "오늘 하루동안 보지 않기" 라는 팝업 체크박스도 쿠키에 저장할 수 있다 !!!!!! 신기방기... 근데 "브라우저에 저장된다"라는 것은, 내 노트북으로 같은 사이트를 접속할 때 서로 다른 쿠키가 발급된다는 뜻이기도 하다. 크롬으로 로그인했을 때 발급되는 쿠키랑 사파리, 엣지 등으로 접속했을 때 발급되는 쿠키가 별개라는 뜻이다.
- 인증 정보 : 지난번 토큰에 대해 배울 때, 사용자 인증 정보가 담긴 JWT를 쿠키에 넣을 수 있다고 했다. 그래서 보통 인증된 사용자가 사이트를 재방문할 때 이용할 수 있다.
- 사용자 관심사 : 그리고 앞서 말하길 쿠키에는 인증정보 뿐만 아니라, 사용자의 검색기록이나 방문 사이트 등을 담을 수 있는데, 이것으로 사용자의 관심사를 알 수 있다. 그래서 매번 배너광고에 내가 쿠팡에 검색했던 물건들이 뜨곤 한다 .....
Q. 왜 굳이 쿠키로 사용자 정보를 저장 ??
A. HTTP는 stateless 즉 상태를 저장하지 않는 프로토콜이므로 사용자가 페이지를 이동할 때마다 로그인 상태를 유지하거나 쇼핑 카트에 담긴 상품 목록을 저장하는 등의 기능을 제공하기 위해서는 추가적인 상태 관리 방법이 필요하다 !!!
※ 말하다보면, 지난번 JWT처럼 쿠키는 토큰과 유사하다는 느낌을 준다. 사실 토큰이 쿠키에 담기므로 토큰의 일종이라고 볼 수 있다고 본다. 물론 토큰이 좀 더 암호화된 정보이고, 토큰이라고 해서 반드시 쿠키에 저장되는 것도 아니다.
쿠키에는 보통 어떤 정보가 저장될까 ???
- name : 쿠키 이름
- value : 쿠키에 저장되는 데이터
- domain : 쿠키가 적용되는 도메인
- path : 쿠키가 적용되는 URL 경로
- expiration time : 쿠키가 만료되는 시간
- 보안 플래그: 쿠키가 HTTPS를 통해서만 전송되도록 할지 설정하는 옵션
→ 지금은 쿠키이름, url 이정도지만 만약 쿠키에 사용자의 id, pw, 신용카드 정보 등이 담긴다면 어떻게 될까 ?? 이게 탈취당했을 땐 큰 손해를 볼 수 있다. 그래서 쿠키가 탈취당하지 않게 조심해야한다. 어떻게 조심하라는 것인지는 맨 뒤에서 알아보자.
세션
지난번 JWT를 할 때 세션 테이블을 배웠는데, 정확히 세션이란 것이 무엇일까 ?? 세션은 서버에서 관리하는 상태 정보이다. 저번에 세션 테이블을 만들어서 로그인 사용자에 대해 인증 유무를 관리했듯이, 서버에서 상태를 관리할 수 있다.
- 저장 위치 : 세션은 서버 측에서 관리. 세션의 크기 제한은 없지만 너무 많이 저장하면 서버에 부담이다.
- 유효 기간 : 세션도 만료 시간이 있지만, 기본적으로는 클라이언트가 브라우저를 닫으면 세션이 만료되는 형태이다. 물론 서버에서 명시적으로 세션 만료 시간을 설정할 수도 있다.
- 보안 : 세션은 쿠키보다 보안이 더 뛰어나다. 애당초 서버에서 관리하므로 클라이언트측에서 탈취당할 위험도 없다.
쿠키와 세션 차이점 정리
쿠키 | 세션 | |
저장 위치 | 클라이언트 (브라우저) | 서버 |
보안 | 보안취약, 탈취위험 있음 | 서버에서 관리하므로 더 안전 |
유효 기간 | 만료 시간이 설정되어있음 | 기본적으로 브라우저 닫으면 만료. 따로 시간 설정도 가능 |
데이터 크키 | 4kb | 제한X |
용도 | 사용자 설정, 검색기록 등 상대적으로 덜 중요한 것들 | 사용자 인증, 중요한 데이터 |
쿠키 + 세션 (= 세션ID를 쿠키에 저장)
쿠키와 세션을 함께 사용하면 보안을 더 강력하게 만들 수 있다. 근데 어떻게 ??? 쿠키와 세션을 함께 쓰는 것은, 서버에서 상태를 유지하고, 클라이언트 측에서 최소한의 정보를 관리할 때 유용하다. 흐름을 알아보자.
저번 시간에 "세션 테이블"이라는 것을 다뤘는데, 사용자 인증이 되면 세션 테이블에 로그인했다고 사용자에 대해 기록하는 것이었다. 그래서 세션id와 유저id를 적어두는 것인데, 이 세션ID를 사용자 쿠키에 담는 것이 바로 쿠키+세션이다.
→ 그럼 이게 왜 좋느냐 ? 쿠키는 탈취위험이 있어서 중요하지 않은 정보를 다룬다. 물론, JWT는 토큰 자체가 암호화되어있고 시그니처로 무결성 보장이 가능해서 쿠키에 담을 수 있다. 어쨌든 쿠키에 세션ID를 담으면 탈취당해도 사용자 정보가 직접적으로 담긴 것은 아니기에 보안을 챙길 수 있다는 것이다. 그러면서도 인증 정보를 담기 때문에 세션의 효율성도 챙길 수 있게 된다.
물론..... 쿠키가 탈취당해서 세션이 넘어간다면(세션 하이재킹) 나처럼 위장해서 서버에 요청을 보낼 수 있다. 이를 막기 위해선 보통 2가지를 추천한다.
- HttpOnly 플래그 : 쿠키를 자바스크립트에서 접근하지 못하도록 설정하여 XSS 공격을 방지
- Secure 플래그 : 쿠키가 HTTPS 연결에서만 전송되도록 하여 네트워크 상에서 탈취당하지 않도록 보호합니다.
물론 쿠키+세션도 단점이 있다.
1. 유저 정보가 서버에 있어서 처리 속도가 좀 있음.
2. 유저 엄청 많아지면 세션 테이블도 커지니깐 저장공간 비용 발생
'1일 1개념정리 (24년 8월~) > 네트워크, 클라우드' 카테고리의 다른 글
1일1개 (69) - 쓰아아쓰 (5) | 2024.10.25 |
---|---|
1일1개 (61) - 서브넷 마스크 계산하기 (0) | 2024.10.15 |
1일1개 (47) - Azure 서비스 알아보기 (1) | 2024.10.01 |
1일1개 (46) - 서브넷 마스크 (0) | 2024.09.30 |
1일1개 (29) - Azure (0) | 2024.09.08 |