2023. 3. 15. 01:20ㆍWEB
◎ Cookie
-> 웹 사이트 접속 시 서버가 클라이언트에 전달하는 작은 데이터
-> 서버가 클라이언트에 데이터를 저장하여 필요할 때 해당 데이터를 불러와서 사용하는 방식이다.
-> 클라이언트에서 서버로 쿠키를 전송하는 것도 쿠키를 이용하는 것이다.
-> 데이터 저장 후 해당 데이터는 아무 때나 가져올 수 있는 것이 아니라 특정 조건이 만족하는 경우에만 데이터를 가져올 수 있다. 이것을 쿠키 옵션이라 한다.
-> 다음은 쿠키 옵션의 종류이다.
1. Domain : 도메인은 www.google.com처럼 서버에 접속할 수 있는 이름이다. 쿠키 옵션에 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인을 비교하여 일치하는 경우에만 쿠키를 전송할 수 있다. 즉, 서버와 요청의 도메인이 일치하는 경우에 쿠키를 전송한다.
2. Path : 세부 경로는 서버가 *라우팅할 때 사용하는 경로다. 만약 요청하는 URL이 https://www.localhost:8080/user/login 이라면 세부 경로는 /user/login이 된다. Path 옵션은 설정된 path를 만족하는 경우 요청하는 path가 추가로 존재해도 쿠키를 서버에 전송할 수 있다. path가 '/user' 로 설정되어 있고, 요청하는 세부 경로가 /user/list 라면 쿠키 전송이 가능하다. 하지만 해당 path에 세부 경로가 /manager/list 라면 path 옵션을 만족하지 못하여 서버로 쿠키를 전송할 수 없다. 즉, 서버와 오청의 세부 경로가 일치하는 경우 쿠키를 전송한다.
* 라우탕 : 네트워크에서 경로를 선택하는 프로세스
3. MaxAge or Expires : 쿠키가 유효한 기간을 정하는 옵션. MaxAge는 앞으로 쿠키를 몇 초동안 유효하게 할 건지 정하는 옵션이다. Expires는 언제 까지 쿠키가 유효한지 data를 지정하는 옵션이다. 클라이언트의 시간을 기준으로 한다. 쿠키는 이 옵션에 따라 세션 쿠키와 영속성 쿠키로 나눠진다.
세션 쿠키 : MaxAge 또는 Expires옵션이 없는 쿠키로 브라우저가 실행 중일 때 사용가능한 임시 쿠키다. 브라우저가 종료되면 해당 쿠키는 삭제된다.
영속성 쿠키 : 브라우저의 종료 여부와 상관 없이 MaxAge 또는 Expires에 지정된 유효시간 만큼 사용 가능한 쿠키
4. Secure : 쿠키를 전송할 때 사용하는 프로토콜에 따른 쿠키 전송 여부 결정. 이 옵션이 true인 경우 HTTPS 프로토콜을 이용한 통신인 경우에만 쿠키를 전송할 수 있다. Secure 옵션이 없으면 http://www.hong.com 이나 https://www.hong.com 에 모두 쿠키를 전송할 수 있다. 즉, https프로토콜에서만 쿠키 전송 여부를 결정하는 옵션이다.
5. HttpOnly : 자바 스크립트에서 브라우저의 쿠키에 접근 여부 결정. 해당 옵션이 true면 자바 스크립트에서는 쿠키에 접근할 수 없다. 디폴트는 false로 false인 경우 자바 스크립트에서 쿠키에 접근이 가능하다.
6. SameSite : Cross-Origin 요청을 받은 경우 요청에서 사용한 메서드와 해당 옵션(post,get,patch....)의 조합에 따라 서버의 쿠키 전송 여부 결정한다. 아래는 사용할 수 있는 옵션이다.
Lax : Cross-Origin 요청이면 GET메서드에 대해서만 쿠키를 전송할 수 있다.
Strict : Cross-Origin이 아닌 *Same-Site인 경우에만 쿠키를 전송할 수 있다.
None : 항상 쿠키를 보낼 수 있다. 쿠키 옵션 중 Secure 옵션이 필요하다.
*same-site는 요청을 보낸 Origin과 서버의 도메인, 프로토콜, 포트가 같은 경우를 의미한다. 이 중 하나라도 다르면 Cross-Origin으로 구분된다.
이런 옵션들을 지정하고, 서버에서 클라이언트로 쿠키를 처음 전송하게 되면 헤더에 set-cookie라는 프로퍼티에 쿠키를 담아 쿠키를 보낸다. 이후 클라이언트나 서버에서 쿠키를 전송하게 되면 클라이언트는 헤더에 Cookie라는 프로퍼티에 쿠키를 담아 전송한다.
◎ 쿠키를 이용한 상태 유지
-> 쿠키를 이용해 서버는 클라이언트에 인증 정보를 담은 쿠키를 전송하고, 클라이언트는 전달받은 쿠키를 요청과 함께 전송하여 Stateless한 연결을 Stateful하게 할 수 있다.
-> 기본적으로 쿠키는 오랜 시간 유지될 수 있고, 자바 스크립트에 의해 접근할 수 있기 때문에 쿠키에 민감한 정보를 담는 것은 위험하다. 해당 민감 정보를 탈취하여 서버에 요청을 보내면 서버는 누가 요청을 보냈는지는 상관하지 않고, 인증된 유저의 요청으로 취급하여 민감 정보에 접근이 가능하다.
◎ 세션
-> 서버와 클라이언트 간 연결이 활성화된 상태
-> 데이터를 클라이언트에 저장했던 쿠키와 다르게 데이터를 서버에 저장한다.
-> 쿠키에는 해당 데이터에 대한 id만 암호화된 상태로 부여한다.
<로그인>
-> 사용자가 아이디와 비밀번호로 로그인을 시도하고, 아이디와 비밀번호가 맞으면 서버는 인증에 성공했다고 판단한다. 이후 서버가 해당 유저가 인증에 성공했음을 알게 되면 유저가 매번 로그인할 필요가 없다.
-> 즉, 서버는 사용자가 인증에 성공했음을 알고, 클라이언트는 인증 성공을 증명할 수단을 가지고 있으면 유저가 매번 로그인할 필요가 없다.
-> 사용자가 인증에 성공한 상태를 세션이라고 한다.
-> 세션이 만들어지면 각 세션을 구분하는 세션 아이디가 만들어진다. 클라이언트에서 세션 성공을 증명할 수단으로 세션 아이디를 전달한다.(위 그림 4번)
-> 이때 웹사이트에서 로그인 상태를 유지하기 위해 쿠키를 사용한다. 쿠키에는 서버에서 발급한 세션 아이디를 저장한다.
-> 쿠키를 통해 유효한 세션아이디가 서버에 전달되고, 세션 스토어(세션이 저장되는 공간)에 해당 세션이 존재하면 서버는 요청에 접근 가능하다고 판단한다.
-> 만약 쿠키에 세션 아이디가 없는 경우 서버는 해당 요청이 인증되지 않았음을 알린다.
<로그아웃>
-> 세션 아이디가 담긴 쿠키는 클라이언트에 있고, 서버는 세션을 저장하고 있다.
-> 여기서 쿠키는 세션 아이디, 즉 인증 성공에 대한 증명을 하고 있기 때문에 만약 데이터가 탈취되면 서버는 이 요청이 인증된 사용자의 요청이라고 판단하게 된다. 따라서 공공 pc에서는 반드시 로그아웃을 해야 한다.
-> 로그아웃을 위해 서버는 세션 정보를 삭제하고, 클라이언트는 쿠키를 갱신해야 한다.
-> 서버가 클라이언트의 쿠키를 임의로 삭제는 못한다. set-cookie로 클라이언트에게 쿠키 전송시 세션 아이디의 키값을 무효한 값으로 갱신하면 된다.
◎ 세션의 단점
-> 세션은 서버의 메모리에 세션 정보를 저장하는데, 만약 서버의 이용자가 매우 많다면 메모리 같은 저장 공간의 일정 부분을 항상 차지하고 있어 가용 메모리의 양이 줄어 서버 성능이 떨어진다.
-> 쿠키를 사용하기 때문에 세션 아이디가 담긴 쿠키가 탈취되면 문제가 발생한다.