Cookie
서버가 일방적으로 클라이언트에 영속성이 있는 데이터를 저장하는 방법
➡️ 무상태성을 가지는 http 대신 cookie가 데이터를 기억하는 것
- Domain : 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키 전송 가능
- Path : 세부 경로가 일치하거나 설정된 경로를 포함하는 하위 경로로 요청을 해도 쿠키 전송 가능
- MaxAge or Expires : 유효한 기간 설정하여 설정한 시간(초단위)이나 날짜(유효 날짜) 초과시 쿠키는 자동 파괴 ➡️ 보안면에서 중요
- 세션 쿠키 : 옵션이 없는 쿠키로 브라우저가 실행 중일 때 사용할 수 있는 임시 쿠키로 브라우저 종료시 쿠키도 삭제
- 영속성 쿠키 : 브라우저 종료 여부와 상관없이 설정한 유효한 시간만큼 사용가능한 쿠키
- Secure : 사용하는 프로토콜에 따른 쿠키 전송 여부 결정 옵션, true 일 경우 HTTPS를 이용할 때만 쿠키 전송 가능, 옵션이 없으면 상관없이 모든 쿠키 전송 가능
- HttpOnly : 스크립트의 쿠키 접근 가능 여부 결정, 옵션이 없으면 기본적으로 false로 지정이 되어
document.cookie
를 이용해 쿠키에 접근할 수 있어 XSS 공격에 취약, true 일 경우 접근 불가
- SameSite : CORS(Cross-Site) 요청의 경우 옵션 및 메서드에 따라 쿠키 전송 여부 결정
- Cross-Origin : 서버의 도메인, 프로토콜, 포트가 다른 경우 (같은 경우는 Same-Origin)
- Cross-Site : eTLD+1(최상위 도메인 TLD 의 바로 왼쪽의 하위 레벨 도메인을 합한 것)이 다른 경우
- Lax : GET 메서드 요청만 쿠키 전송 가능
- Strict : 쿠키 전송 불가
- None : 모든 메서드 요청에 대해 쿠키 전송 가능
- 클라이언트가 페이지를 요청한다.
- 서버에서 이런 옵션들을 지정하여 쿠키를 생성한다.
- 서버에서 http header에
Set-Cookie
프로퍼티로 쿠키를 담아 전송한다.
- 브라우저가 종료되어도 쿠키의 유효 시간이 남아있다면 클라이언트에서 보관하고 있는다.
- 동일 사이트를 재방문하여 동일한 request가 갈 경우 이미 존재하고 있는 쿠키를 http header로 함께 보낸다.
- 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 http header에 포함시켜 응답한다.
➡️ Stateledss 한 인터넷 연결을 Stateful 하게 유지할 수 있다.
[실습]
Session
서버가 클라이언트에게 유일하고 암호화된 ID 를 부여하고 중요 데이터는 서버에서 관리함, 사용자가 인증에 성공한 상태를 말함
- 클라이언트가 서버에 접속 시 세션 ID를 발급 받는다.
- 클라이언트는 세션 ID에 대해 쿠키를 사용해 브라우저에 저장한다.
- 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청한다.
- 서버는 세션 ID를 전달받아 세션 ID로 세션에 있는 클라이언트 정보를 가져와서 사용한다.
- 클라이언트 정보로 서버 요청을 처리하며 클라이언트에 응답한다.
Session-based Authentication 세션기반 인증
🧩 로그인
- 사용자가 정확한 아이디와 비밀번호 입력시, 서버는 인증에 성공했다고 판단한다.
- 서버는 '인증 성공'을 알고 있으면 사용자는 매번 로그인을 할 필요가 없다.
➡️ 인증에 따라 리소스 접근권한이 달라진다. ( 서버는 사용자가 인증성공임을 알고 있어야 하고, 클라이언트는 인증 성공 증명 수단을 가지고 있어야 함 )
- 세션: 사용자가 인증에 성공한 상태 => 서버는 이 세션을 in-memory 나 DB에 저장한다.
- 세션이 만들어지면 세션을 구분할 수 있는 세션 아이디가 만들어지고 , 클라이언트에 전달한다.
- 로그인 유지수단으로 쿠키를 사용하는데 쿠키에 세션 아이디를 저장한다.
- 쿠키를 통해 세션 아이디가 서버에 전달되고, DB에 존재한다면 서버는 해당 요청에 접근 가능하다고 판단한다. 존재하지 않다면 요청이 인증되지 않음을 알려준다.
🧩 로그아웃
- 클라이언트 측은 세션 아이디(인증 성공 증명 수단)이 담긴 쿠키가 저장
- 서버 측은 세션을 저장하고 세션 아이디로만 인증 여부 판단
- 로그아웃 시 , 클라이언트는 쿠키를 변경하거나 삭제하고 , 서버는 세션 정보를 삭제해야한다.
Cookie vs Session
Cookie 들은 클라이언트 측에 저장되고
Session은 쿠키를 기반으로 하나 서버 측에 관리된다.
항목 | 쿠키 | 세션 | 설명 |
---|
저장위치 | 브라우저 | 서버 | |
보안 | ⬇ | ⬆ | 세션은 서버에 저장되어 세션 ID만 로컬에 저장하고 처리는 서버에서 하기 때문에 비교적 보안성이 좋다. |
속도 | ⬆ | ⬇ | 세션은 서버의 처리가 필요하기 때문에 느리다. |
라이프 사이클 | 브라우저를 종료해도 저장될 수 있다. | 만료시간을 설정하거나 세션 ID를 날려 참조할 수 없게 지울 수 있다. | |
쿠키 대신 세션을 사용하면 되는 거 아닌가요? 아니다.
세션은 서버의 자원을 사용하기 때문에 무분별하게 만들면 서버의 메모리가 감당할 수 없어서 속도가 느려질 수 있어 쿠키가 유리한 경우가 있다.