hongcheol / CS-study

cs지식을 정리하는 공간
MIT License
248 stars 30 forks source link

쿠키, 세션 #108

Open nayoon-kim opened 3 years ago

nayoon-kim commented 3 years ago

쿠키, 세션

쿠키와 세션을 사용하는 이유

클라이언트 정보 유지를 위해 사용한다. HTTP 프로토콜의 특징인 비연결성(Connectionless)과 무상태성(Stateless)를 보완하기 위해서 사용한다.

(비연결성이란 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징) (무상태성이란 통신이 끝나면 상태를 유지하지 않는 특징으로 클라이언트의 상태를 유지하지 않는다.)

쿠키 (Cookie)

쿠키 사양

종류

  1. 세션 쿠키(Session Cookie) 브라우저가 종료되면 사라지는 쿠키로 브라우저 메모리에 저장된다.
  2. 지속 쿠키(Persistent Cookie) 브라우저가 종료되어도 남아있는 쿠키로 파일 형태로 저장된다.

동작 방식

  1. 클라이언트가 페이지를 요청한다.
  2. 서버에서 쿠키를 생성해서 HTTP Response Header에 쿠키를 포함시켜서 응답한다.
  3. 클라이언트 로컬 PC에 쿠키를 저장한다.
  4. 같은 웹 사이트를 청할 경우 HTTP Header에 쿠키 정보를 담아 서버에 요청한다.
  5. 서버에서 쿠키를 읽어 이전 상태를 변경할 필요가 있을 경우 쿠키를 업데이트해서 변경된 쿠키를 HTTP 헤더에 포함시켜 응답한다.

쿠키 생성 삭제 코드

- 쿠키 삭제
```java
    Cookie cookie = new Cookie("cookieName", null); // 삭제하고자 하는 쿠키에 대한 값을 null로 지정
    cookie.setMaxAge(0); // 쿠키가 삭제될 수 있도록 만료 시간을 0으로 변경
    response.addCookie(cookie); // ResponseHeader에 cookie를 포함

세션(Session)

동작 방식

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급받는다.
  2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있는다.
  3. 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 서버에 전달해서 사용한다.
  4. 서버는 세션 ID를 전달받아서 별다른 작업없이 세션 ID로 세션에 있는 클라이언트 정보를 가지고 온다.
  5. 클라이언트 정보를 가지고 서버 요청을 처리해서 클라이언트에게 응답한다.

세션 생성 삭제 코드

쿠키와 세션의 차이

2) 보안 세션이 쿠키보다 훨씬 우수하다. 쿠키의 경우 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑당할 우려가 있어서 보안에 취약하다. 세션은 쿠키를 이용해서 세션ID만 저장하고 서버에서 처리하기 때문에 비교적 보안성이 좋다. (스니핑이란 해킹 기법으로 네트워크 상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것을 의미합니다. 전화로 비유하면 도청과 같습니다.)

3) 요청 속도 쿠키가 세션보다 훨씬 빠르다. (세션은 서버의 처리가 필요하기 때문) 4) 라이프 사이클(만료시간) 쿠키가 세션보다 훨씬 오래 저장할 수 있다. 쿠키도 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아있을 수 있다. 또한, 만료기간을 넉넉하게 잡아두면 쿠키를 임의로 삭제할 때까지 유지될 수도 있다. 반면 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다.

보안적인 측면에서 세션이 쿠키보다 훨씬 우수하지만 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없을 뿐만 아니라 속도가 느려질 수 있기 때문이다.

쿠키, 세션 사용

쿠키는 보안에 있어서 취약하기 때문에 장바구니와 같이 보안과 관련없는 부분에서 사용된다.

서버 인증 방식

서버에 인증하는 방식으로는 계정정보를 요청 헤더에 넣는 방식, Session/Cookie방식, 토큰 기반 인증 방식(JWT)가 있다.

  1. 요청 헤더에 계정 정보를 넣는 방식 말 그대로 Request Header에 ID, PW를 담아 보내는 방식 사용자의 프라이빗한 정보를 공개적으로 담아 보내는 방식으로 HTTP 요청을 가로챌 경우 사용자의 계정정보를 알 수 있다. 보안에 매우 취약하기 때문에 개발 단계에서 인증을 빠르게 시도할 때 사용한다. 요청을 보낼 때마다 ID와 PW로 인증해야 하기 때문에 매우 비효율적인 방법이다.

  2. Session/Cookie 방식 1) 사용자가 로그인을 한다. 2) 서버에서는 계정정보를 읽어 사용자를 확인한 후, 사용자의 고유한 ID값을 부여해서 세션 저장소에 저장한 후, 이와 연결되는 세션 ID를 발행한다. 3) 사용자는 서버에서 해당 세션 ID를 받아 쿠키에 저장하고 인증이 필요한 요청마다 쿠키를 헤더에 실어 보낸다. 4) 서버에서는 쿠키를 받아 세션 저장소에서 대조를 한 후 대응되는 정보를 가져온다. 5) 인증이 완료되고 서버는 사용자에 맞는 데이터를 보낸다.

세션 ID를 쿠키로 저장해서 인증이 필요할 때마다 사용한다. 세션 ID는 유의미한 값을 가지고 있지 않기 때문에 노출되더라도 문제가 되지 않으며 계정정보를 담아 인증하던 방식보다 훨씬 안전하다.

세션 저장소를 사용하기 때문에 서버에 추가적인 저장공간을 필요로 하기 때문에 서버 부하가 높아진다.

nayoon-kim commented 3 years ago
  1. 세션, 쿠키를 사용하는 이유?