session 과 쿠키

BackEnd_Ash.log·2020년 9월 7일
0

✅세션

서버에 클라이언트의 상태 정보를 저장하는 기술로
논리적인 연결을 세션이라고 한다.
웹 서버에 클라이언트에 대한 정보를 저장하고 클라이언트에게는 클라이언트를 구분할 수 있는 ID 를 부여하는데 이것을 세션아이디라 한다.

다시말해서

클라이언트별 정보를 브라우저가 아닌 웹서버에 저장하는 것이다.

👉세션의 원리

  1. 유저가 웹사이트에 접속
  2. 웹사이트의 서버가 유저에게 sessionId 를 cookie 에 보존
  3. 유저의 브라우저가 이 sessionId 를 cookie에 보존
  4. 통신할때마다 sessionId 를 웹서버에 전송 ( 따라서 django 의 경우 request 객체에 sessionId 가 들어있음)
  5. sessionId 에 의해 웹사이트는 많은 접속 유저중 특정 유저를 인식 할 수 있음

👉단점

세션은 쿠키 를 기반으로 하지만 서버에 저장하여 관리한다.
서버에서는 클라이언트를 구별 하기 위해 각각 sessionID 를 클라이언트마다 부여하게 되며 클라이언트가 종료되기 전까지 유지하게 된다.

즉 세션은 서버에 저장되고 서버자원을 사용하기 때문에 사용자가 많을 경우나 데이터가 많은 경우 자원이 상당하다.

✅쿠키

쿠키는 클라이언트에 저장되는 keyvalue 로 이루어진 데이터이다.
인증 유효 시간을 설정할 수 있고 , 유효 시간이 정해진다면 클라이언트가 종료 되어도 쿠키 가 유지된다.
서버와 요청 응답으로 인해 쿠키 가 저장되면 다음 요청은 쿠키 에 담긴 정보를 이용해 참조한다.

👉 쿠키의원리

  1. 클라이언트가 로그인 요청
  2. 서버에서 쿠키 생성 후 클라이언트로 전달
  3. 클라이언트가 서버로 요청을 보낼때 쿠키를 전송
  4. 쿠키를 이용해 유저 인증을 진행

👉 단점

문제점으로 사용자 인증에 대한 정보를 모두 클라이언트가 가지고 있게 되므로 http 요청을 탈취당할 경우 쿠키 자체를 탈취당해 사용자 정보를 모두 해킹 당할 수 있다.

그래서 쿠키 자체는 보안과는 큰 상관이 없는 장바구니 혹은 자동로그인 설정 등에 이용할 수 있다고 합니다.

✅토큰(JWT)

JWTJson Web Token 의 약자이다 .
인증에 필요한 정보들을 암호화 시킨 토큰을 말한다.

  • Header : 3가지 요소를 암호화할 알고리즘 등과 같은 옵션이 들어간다.

  • Payload : 유저의 고유 ID 등 인증에 필요한 정보가 들어간다.

  • Verify Signature : Header , Payload 와 Secret Key 가 더해져 암호화 된다.

  • Header 와 Payload 는 누구나 디코딩하여 내용을 확인할 수 있기때문에 유저의 비밀번호 같은 정보는 넣지 않습니다.

  • 하지만 Secret Key 를 알지 못하면 VerifySignature 는 복호화 할 수 없습니다.

그렇기 때문에 토큰을 변조하더라도 VerifySignature 가 Payload 를 기반으로 암호화 되었기 때문에 유효하지 않은 토큰으로 검증이 가능하다.

👉 토큰의 원리

  1. 클라이언트가 로그인 요청
  2. 서버에서 유저의 고유한 ID 등 인정 정보를 Payload 에 담습니다.
  3. JWT 의 유효기간 설정 및 옵션을 설정해 줍니다.
  4. Secret Key 를 이용해 토큰을 발급한다.
  5. 발급된 토큰은 클라이언트에 쿠키 혹은 localStorage 등에 저장하여 요청을 보낼때마다 같이 보낸다.
  6. 서버는 토큰을 Secret Key 로 복호화하여 검증하는 과정을 거친다.
  7. 검증이 완료되면 대응하는 데이터를 보내준다.

토큰은 세션처럼 별도의 저장소 관리가 필요하지 않다.
클라이언트에게 전송후 검증하는 과정만 있으면 된다.

하지만 보안적인 측면에서는 세션이 더 낫다.

세션같은 경우에는 악의적으로 사용된다면 해당 세션을 삭제하면 된다.
토큰은 탈취당하게 되면 유효 시간이 종료되기 전까지는 탈취자가 얼마든지 악의적으로 사용이 가능하다.

그래서 Refresh Token 이라는 것을 이용해 피해를 줄일 수 있다.

profile
꾸준함이란 ... ?

0개의 댓글