항목 |
개념 및 특징 |
쿠키 |
정의: 사용자의 정보를 저장하고, 개인화된 사이트를 제공하기 위해 사용되는 작은 텍스트 파일 |
- ex) JWT 토큰
- 쿠키의 만료 시간 설정에 GMT(그리니치 표준시)를 사용한다. 그 이유는 GMT는 전 세계적으로 사용되는 표준 시간대이므로, 서버와 클라이언트가 모두 동일한 기준으로 시간을 설정하여 시간대에 따른 혼란을 방지 |
| 퍼스트파티 쿠키 | 정의: 사용자가 직접 방문한 웹사이트에서 설정한 쿠키. 즉, 웹사이트의 도메인과 쿠키가 설정된 도메인이 동일
- 개인화된 편리한 사용자 경험을 지원 |
| 서드파티 쿠키 | 정의: 사용자가 방문 중인 웹사이트의 도메인과 다른 도메인에서 설정한 쿠키로, 웹사이트 도메인과 쿠키 도메인이 다를 때 발생
- ex) 광고 네트워크, 소셜 미디어 플랫폼 등 제3자에 의해 설정 → 여러 웹사이트에서 사용자의 행동을 추적하여 광고 타겟팅, 웹 분석, 소셜 미디어 기능 등을 제공하는 데 사용
- 개인화된 광고와 웹 분석 등 다양한 제3자 서비스를 위해 활용 |
| Persistent Cookie | 정의: 유효시간이 명시되어 있는 쿠키로, 브라우저를 닫아도 삭제되지 않는 쿠키
MaxAge
또는 Expires
옵션을 사용하여 유효시간을 설정 |
| Session Cookie | 정의: 유효시간이 명시되어 있지 않아 브라우저가 닫히면 삭제되는 쿠키
- 브라우저를 닫을 때 자동으로 삭제되므로 주로 로그인 유지에 사용 |
| 쿠키 보안 속성 | - 쿠키는 민감 정보 노출의 위험이 있다. ex) XSS 공격, MITM, CSRF 공격
- 이러한 보안적 단점을 방지하기 위해
HttpOnly
, Secure
, SameSite
속성 설정해야한다.
- HttpOnly: 자바스크립트를 통한 쿠키 접근을 차단하여, XSS 공격으로부터 쿠키 정보를 보호 → XSS 공격 방지
- Secure: 쿠키가 HTTPS를 통해서만 전송되도록 하여, 데이터가 암호화된 연결을 통해서만 전송되게 함으로써 보안 → MITM 방지
- SameSite: 쿠키가 퍼스트파티에서만 전송되도록 제한하는 용도로 사용 → CSRF 공격 방지 |
| | |
| 세션 | 정의: 컴퓨터 프로세스들 사이에서, 서로를 인식한 후 데이터 송수신을 마칠 때까지의 기간의 상태정보
ex) 로그인을 한 뒤 로그아웃하기 전까지, 또는 HTTP 요청을 보내고 응답을 받을 때까지의 모든 과정
- 웹 서버 측에 별도의 저장소(DB)에 저장된다
- 세션 스토리지는 속도가 매우 중요 → 메모리 기반 데이터베이스인 Redis가 많이 사용된다.
- 사용 이유: 사용자의 정보를 서버측에서 관리해 보안을 강화 |
| 세션 ID와 쿠키의 관계 | 웹 브라우저의 쿠키에는 어떤 세션인지 식별하기 위한 세션 ID(Session ID) 값이 저장된다. → 세션은 웹 브라우저로부터 세션 ID를 받아 해당 요청 사용자의 정보를 서버 측 저장소에서 조회한다. |
| | |
| 스로리지 | 정의: 사용자의 데이터를 일시적 또는 영구적으로 저장하기 위한 안전한 저장소, 사용자에 의해 변경된 옵션 상태 등 필요에 따라 조회가 필요한 정보를 저장
- ex) 검색 기록, 방문 사이트, 소셜 계정 정보 등등
- 쿠키(Cookie)나 세션(Session)처럼 상태 유지를 위한(Stateful) HTTP 기술은 아니다.
- Stateful HTTP를 위한 쿠키가 웹 브라우저 저장소로 남용되는 것을 방지하기 위해 도입됨.
- 스토리지는 클라이언트 측에서만 접근 가능한 데이터 저장 → 서버와 통신 x |
| 로컬 스토리지 | 정의: 웹 브라우저 창을 닫아도 데이터가 영구적으로 저장되는 저장소
- ex) 사용자 설정, 테마, 즐겨찾기 목록
- 저장 용량에 대한 관리가 필요하며, 과도한 데이터 저장은 성능 저하를 유발 |
| 세션 스토리지 | 정의: 세션 스토리지는 웹 브라우저 창을 닫으면 데이터가 삭제되는 저장소
- 페이지 간의 데이터 전달 등 세션 동안에만 필요한 데이터를 저장 |
1️⃣ HTTP가 Stateless하다는 의미
- HTTP가 본질적으로 Stateless하다는 의미: 각 요청(Request)과 응답(Response)이 독립적이며, 서버는 이전 요청의 상태를 기억하지 않는다는 의미한다. 즉, 클라이언트가 요청을 보낼 때마다 새로운 연결이 이루어지고, 서버는 이전 요청의 맥락을 알지 못한 채 응답을 반환
2️⃣ 쿠키가 전송됨에 따른 네트워크 오버헤드 문제와 해결 방법
쿠키는 Domain
과 Path
가 일치하면 해당 웹 서버로 모든 쿠키를 담아 보내기 때문에, 쿠키로 저장하려는 정보량이 많아질수록 요청 크기가 커질 수 있다. 이는 불필요한 네트워크 오버헤드를 발생시켜 요청 사이즈가 커지는 원인이 된다.
따라서 쿠키를 단순한 저장소로 사용하는 것은 권장되지 않고 있다. 웹 서버에게 전달할 필요가 없는 정보의 경우 웹 스토리지(Storage) 사용할 수 있다.
또다른 해결 방법으로는 세션이 있다. 세션은 정보를 웹 서버 측에 저장하므로 클라이언트의 요청 크기에 영향을 주지 않는다.
3️⃣ 쿠키의 만료 시간을 설정하는 Expires와 Max-Age 옵션의 차이점
- Expires : 특정 날짜와 시간을 지정하여 쿠키의 만료 시점을 정하는 방식으로 쿠키는
Expires
에 설정된 날짜가 지나면 자동으로 삭제된다.
특징: 절대 시간 기준으로 만료됨으로 서버의 시간과 클라이언트의 시간이 다를 경우 오차 발생 가능
- Max-Age: 쿠키가 생성된 시점부터 몇 초 동안 유효한지를 설정하는 방식으로 쿠키가 현재 시점부터
Max-Age
에 설정된 초(second) 단위의 시간이 지나면 자동으로 삭제된다.
특징: 상대적인 시간 기준으로 만료됨으로 서버와 클라이언트의 시간 차이에 영향을 받지 않는다.
- ⭐️ 요즘 대부분의 브라우저는
Max-Age
를 더 선호하며, 시간 동기화 문제를 방지하려면 Max-Age
사용이 권장되고 있다.
4️⃣ CSRF 공격이란? SameSite 속성을 통해 예방 방법
- CSRF(교차 사이트 요청 위조)는 사용자가 신뢰하는 웹사이트에서 의도하지 않은 요청을 보내도록 속이는 공격 기법이다. 공격자는 사용자의 인증된 세션을 악용하여 사용자가 원치 않는 작업(예: 비밀번호 변경, 계좌이체 등)을 수행하도록 유도할 수 있다.
- 쿠키의
SameSite
속성을 사용하면 크로스사이트 요청에서 쿠키 전송을 제한하여 CSRF 공격을 방지할 수 있다. SameSite
에는 세 가지 값이 있다
- Strict: 크로스사이트 요청에서는 쿠키를 전송하지 않음
- Lax: 일부 안전한 크로스사이트 요청(GET, 링크 클릭 등)만 허용
- None: 모든 요청에 대해 쿠키 전송 (Secure 필수)
5️⃣ XSS 공격의 동작 원리와, HttpOnly 속성이 쿠키를 보호하는 방식
XSS(Cross-Site Scripting) 공격은 공격자가 사용자의 웹 브라우저에 악성 스크립트를 주입하고 실행하게 만드는 보안 취약점을 이용한다. 이 스크립트는 사용자의 세션 쿠키를 탈취하여 공격자에게 전송하는 것을 목표로 할 수 있는데, 세션 쿠키가 HttpOnly로 설정되어 있다면, 이러한 스크립트는 쿠키에 접근할 수 없게 된다.