Suyeon9911/TIL

[CS] Cookie, Session, Token

Closed this issue · 7 comments

Cookie

클라이언트가 웹 사이트에 접속할 때 그 사이트가 사용하게 되는 일련의 작은 기록 파일
서버가 클라이언트에 정보를 전달할 때 저장하고자하는 정보를 응답 헤더(쿠키)에 저장하여 전달합니다.
Key Value 형식의 문자열 형태로 저장 !

브라우저 사용시 봤었던 쿠키 !
-> 브라우저에 저장되어서 사용하는 작은 텍스트 파일로써 접속자장치를 인식하거나 일부 데이터를 저장하는 역할 !

쿠키를 쓰는 이유? 어떤 특정 정보를 저장해야 했기 때문 !
로그인을 예로 들어보면 최초로 아이디, 비밀번호 를 가지고 로그인을 하고난 이후에는 로그인이 된 상태에서 요청을
날릴 수 있다 ! 쿠키가 없었다면, 매번 요청을 할 때마다 정해진 쿠키로 아이디, 비밀번호를 동시에 사용자가 날려야하는 번거로움이 있었을 것.

하지만, 쿠키가 갖고 있는 단점 때문에 쿠키만 온전히 사용하진 않는다. !
단점

  • 쿠키는 노출이 되었을 때, 아이디, 비밀번호에 대한 민감 정보까지 다 노출이 되어 보안이 좋지 않다.
  • 조작당해서 들어올 가능성이 있다
  • 웹 브라우저 마다 쿠키에 대한 지원 형태가 다르기 때문에 다른 브라우저 간의 공유가 불가능 !
  • 쿠키의 사이즈가 제한되어있어 원하는 만큼의 충분한 데이터를 담을 수없는 경우가 많음 !
  • 서버는 매번 id pw를 받아서 인증해야된. 조작된 데이터 방지 불가

HTTP 의 Stateless 한 특성

HTTP란 Hyper Text Transfer Protocol의 줄임말로 www상에서 정보를 주고받는 통신방법
주로 HTML 문서를 주고 받는데 사용되며, 클라이언트와 서버가 서로 request와 response를 하며 통신 !
HTTP는 Stateless 하다는 특성을 가진다 !! -> 무상태 ? 라고하는거 같은데
서버가 클라이언트의 정보를 계속 유지하고 있지 않는다는 의미 !!

예를 들어, 클라와 첫번째 통신에서 데이터를 주고 받았다고 해도, 두 번째 통신에서 클라의 이전 데이터를 유지하지 않음!
하지만 사용자가 계속 로그인해야되는 상황이라면? 굉장히 귀찮을테고, Stateless한 프로토콜을 가지고 Stateful한 서비스를 구현하기 위해 사용되는 것이 바로 쿠키와 세션 !!

쿠키와 세션의 차이점은 정보의 저장위치이다 ! 쿠키는 클라에 저장되고 세션은 서버에 저장된다.

쿸히

서버에서 받은 데이터를 임시로 클라에 저장해놓는 것
쿠키가 생긴 이유? HTTP 웹사이트에 해당 페이지의 HTML을 요청하면 응답을 받는 순간 연결이 끊어진다.
계속해서 사용자의 정보를 들고있지 않기 때문.
로그인 정보같이 유저가 굳이 다시 서버에 요청하기에는 비효율적인 정보를 로컬에 저장해둠으로써 생산성을 높인다.

쿠키통신 방법

  1. 최초 통신에서는 쿠키값이 없으므로, 일단 클라이언트는 Request를 한다.
  2. 서버에서 클라이언트가 보낸 Request Header에 쿠키가 없음을 판별하고 , 통신상태를 저장한 쿠키를 response한다.
  3. 클라이언트의 브라우저가 받은 쿠키를 생성/보존
  4. 두번쨰 연결부턴, http header에 쿠키를 실어서 서버에 request

쿠키는 1개의 도메인에 한정, 자동으로 보내질수 없다. 쿠키는 자동으로 세팅, 클라는 총 300개 쿠키 하나의 도메인 당 20개 이상의 쿠키 가질 수 없음 4kb 저장 가능

장점

다시 서버에 request 할 필요가 없기 때문에 속도가 빠루다

단점

로그인 정보 등 사용자의 정보가 저장되는 경우가 많아 보안에 취약

사용예시

팝업보지 않기, 사용자 이전 스크롤링이나 뷰 설정 값 등

Session

서버에 임시로 저장한 파일 , 주로 중요한 데이터를 저장할 때 사용되고, 브라우저를 종료할 때까지 유지된다.

세션통신 방법

  1. 클라가 서버에 접속 시, 세션 id를 발급한다.
  2. 서버에서는 클라가 발급해준 세션 id를 쿠키를 이용해서 저장한다.
  3. 클라이언트는 다시 페이지에 접속할떄, 쿠키에 저장된 세션 id를 서버에 전달한다.
  4. 서버는 request header에 쿠키 정보로 클라이언트를 판별한다. 세션 id를 주고 받을때는 주로 쿠키를 이용하는 경우가 많다.

장점

  • 클라는 세션 id 만 알고 있고, 서버가 정보를 저장하기 때문에 보안성이 좋다

단점

  • 서버에 거쳐서 정보를 받아야하기 때문에 속도가 느리다 !

사용예시

로그인 정보 유지

Token - JWT

토큰은 일종의 암호화된 접근 권한이다.
예를 들어 웹 사이트에 로그인을 할 때 사용자가 ID와 PW를 넣으면 서버는 이를 확인한 후, 사용자에게 유효한 사용자라는 토큰을 발행해준다. 그럼 사용자는 이 토큰을 가지고 웹사이트에서 제공하는 여러 기능들을 이용할 수 있는 것 !

JWT는 인증에 필요한 정보들을 암호화시킨 토큰을 의미 !
위의 세션/쿠키 방식과 유사하게 사용자는 Access Token을 HTTP 헤더에 실어 서버에 전송한다 !~

토큰은 임의로 생성된 비밀번호 같이 동작한다.
토큰은 제한된 수명을 가지고 있어서, 토큰이 한번 만료되면 새로 생성되어야한다. - Refresh token

토큰의 장점 !

  • 세션/ 쿠키는 별도의 저장소 관리가 필요하다. 하지만 jwt는 발급 후 검증만 하면 되기 때문에 추가 저장소가 필요하지 않다.
  • 확장성이 뛰어나다. 토큰 기반으로 하는 다른 인증 시스템에 접근이 가능하다. 페북이나 구글 마이크로 소프트 로그인 등 모두 토큰 기반 인증,

단점

  • 이미 발급된 JWT에 대해서는 유효기간이 만료되기 전까지 계속 사용이 가능하다.
  • 쿠키나 세션은 악의적으로 이용된 경우 그냥 쿠키를 삭제하면된다.
  • 하지만 JWT 는 유효기간이 지나기 전까지는 정보를 이용할 수 있다는 문제 가있다.
  • 이경우 Access token의 유효기간을 짧게 하고 refresh token을 새로 발급하면된다.
  • JWT는 길이가 길어 인증이 필요한 요청이 많을 수록 서버의 자원낭비가 발생..