Kraken-Addicts/HTTP-The-Definitive-Guide

Q5) Cookie, Session (Interview Question in HTTP)

Opened this issue · 5 comments

Q1. Http는 비연결성인가요 연결성인가요?

Q2. 쿠키와 세션에 대해서 설명해주시고 이 둘의 차이점을 설명해주세요.

Q1 비연결성입니다.
서로 요청과 응답을 주고 받을때만 연결되고 그 이외에는 통신을 주고 받지 않습니다.
서버가 여러명의 클라이언트와의 통신에서 리소스를 효율적으로 배분하기 위함입니다.

Q2 둘다 로그인을 유지하기 위한 기능입니다.
로그인 후에 다른 페이지로 이동해도 로그인이 끊기지 않고 유지되도록 Set-Cookie헤더와 아이디와 비밀번호를 직접 적어놓고 HTTP 요청마다 서버가 헤더를 확인해서 로그인을 유지시켜줍니다.
다만 이렇게 되면 아이디와 비번이 노출되므로 보안의 치명적입니다.
이를 해결하기 위해 세션을 사용합니다.
쿠키와 아주 비슷하지만 Set-Cookie헤더에 저장되는게 아이디,비번이 아닌 특정 세션 키값으로 사용자의 신원을 확인합니다.
로그인시 서버는 세션 키값을 사용자에게 발급해주고 사용자는 그 해당키값을 서버에게 보내서 같은 사용자임을 밝힙니다.

즉석
Q1. 연결성이라는 단어의 의미를 잘 모르겠습니다
Q2. 쿠키의 단점을 보완한 것이 세션입니다

보충
Q1.
비연결성입니다.

HTTP의 특징 중 하나인, 비연결성(Connectionless) 은 클라이언트가 보낸 요청에 대해 서버가 응답을 한 후 바로 연결이 끊어지는 특징을 의미합니다.

이러한 비연결적인 특성을 바탕으로 HTTP 무상태성(Stateless) 특징을 띄기도 합니다. 연결이 해제됨과 동시에 서버와 클라이언트는 이전에 요청한 결과에 대해서 잊어버려 '상태'를 유지하지 않는다는 의미입니다.

따라서, 만일 클라이언트가 이전 요청과 같은 데이터를 원한다면, 다시 서버와 연결해서 동일한 요청을 시도해야 합니다.

장점은 서버의 부담을 줄일 수 있다는 점이고,
단점은, 사용자의 상태를 유지시켜줄 수 없다는 점입니다.

따라서 개인화된 사용자경험을 제공하기 위해서는 쿠키와 세션이 필요합니다.

Q2.
쿠키와 세션 모두 인증방식 중 하나입니다.

쿠키와 세션의 가장 큰 차이점은 정보가 저장되는 위치입니다.
쿠키 는 클라이언트 측에서, 세션 은 서버측에 저장되고 관리됩니다.

정보의 특성에 따라, 사용자의 편의를 위하되 지워지거나 가로채거나 했을 때 큰 문제가 생기지 않을만한 정보들은 쿠키에, 사용자나 다른 누군가에게 노출되어서는 안되고 서비스 제공자가 직접 관리해야하는 정보는 세션에 저장하게 됩니다.
모두 세션에 저장하게 된다면 접속자가 많을 때 서버에 부담이 커지므로 개발자의 판단하에 적절하게 분배해서 저장해주어야 합니다.
얄팍한 코딩사전: 쿠키, 세션, 캐시가 뭔가요?

Cookie, Session

참고링크

Http는 비연결성입니다.

연결을 유지하면 리소스가 많이 발생하므로 연결유지를 위한 리소스를 줄여 더 많은 연결을 위해 비연결적 특징을 갖습니다.

http1.1부터 keep-alive헤더로 연결유지가 가능합니다

서버가 클라이언트를 식별할 수 없는 Stateless (무상태) 합니다.

사용자를 식별을 목적으로 HTTP의 Connectionless, Stateless한 특성을 보완하기 위해 등장한 것이 세션, 쿠키입니다.

쿠키?

HTTPset-cookie헤더에 브라우저단에서 쿠키를 저장해 서버가 클라이언트를 식별할 수 있게합니다.

쿠키는 브라우저단에서 저장하므로 공격당하여 위변조에 취약합니다.

만료시간을 정할 수 있으며 로컬에 저장되므로 브라우저를 꺼도 유지가 됩니다.

세션?

세션은 서버단에서 사용자정보를 저장합니다. 하지만 세션도 중간에 탈취 당할 수 있기에 보안에 완벽하지 않습니다.

사용자 정보를 서버에 저장하므로 동접자가 많은 서비스의 경우 서버과부하 발생가능합니다.

만료시간을 정해도 브라우저가 꺼지면 삭제됩니다.

차이?

역할과 동작원리가 비슷하다. 세션도 쿠키를 사용하기 때문이다.

가장 큰 차이점은 사용자 정보가 저장되는 위치

속도는 쿠키가 빠름

보안은 세션이 우수함

이 둘의 문제점을 보완하기 위해 최근에는 토큰기반 인증 방식을 사용함

토큰기반방식?

  • JWT, OAuth가 있음
  • 보호할 데이터 (사용자정보)를 토큰으로 치환하여 원본 데이터 대신 토큰을 사용함
  • OAuth : 다른 웹서비스 계정으로 사용자 인증을 대신함
  • JWT : Json으로 된 Token
    • JSON객체에 요구사항 작성 : (user의 id등 사용자정보)
    • 어떤 암호화방식을 사용해 해당 내용을 문자열로 인코딩
    • HTTP header에 추가 ( cookie )
    • 서버에서 Header에 추가된 Token을 디코딩하여 사용자 인증

🎈 Q1. Http는 비연결성인가요 연결성인가요?

HTTP는 비연결성입니다.

비연결성 (Connectionless)

클라이언트가 서버와 한 번 연결을 맺은 후 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어버리는 성질

비연결성의 장점

HTTP는 불특정 다수와의 통신 환경 기반으로 설계됨

  • 다수의 클라이언트와 연결을 지속해야한다면 많은 리소스가 발생
  • 연결을 유지하기 위한 리소스를 줄이면 더 많은 연결 가능

비연결성의 단점

서버는 클라이언트를 기억하지 못 해 식별 불가 (무상태 Stateless)

  • 동일한 클라이언트의 모든 요청에 매번 새로운 연결을 하고 해제해야하는 오버헤드 발생
  • 오버헤드를 줄이기 위해 KeepAlive 속성 사용 가능
    • 지정된 시간 동안 서버와 클라이언트 사이에 패킷 교환이 없는 경우 안부를 묻기 위한 패킷을 주기적으로 보내 커넥션 유지
    • Connection 헤더에 keep-alive 라고 설정

무상태 (Stateless)

서버가 클라이언트의 상태를 식별할 수 없어 그 전에 처리된 통신에 대해 알 수 없다는 특징

  • 로그인 상태를 유지한 채 웹 서비스 사용 불가
  • 이를 보완하기 위해 정보를 유지하는 cookie와 같은 기술 등장

🎈 Q2. 쿠키와 세션에 대해서 설명해주시고 이 둘의 차이점을 설명해주세요.

쿠키 (Cookie)

브라우저에 사용자 정보를 저장하는 구조

  • 공격자에 의해 탈취, 변조 가능성이 높아 보안에 취약
  • 파일 형태로 저장되어 브라우저가 종료되어도 정보 유지

세션 (Session)

서버에 사용자 정보를 저장하는 구조

  • 중간에 탈취가 가능해 보완에 완벽한 것은 아니지만 비교적 안전
    • 클라이언트를 구분할 수 있는 ID를 부여하는데 이를 이용해 인증받고 정보를 이용한다
  • 서버에 저장하는 것이라 서버의 메모리를 차지
    • 동시 접속자 수가 많은 서버는 서버 과부화의 원인이 됨
  • 브라우저 종료시 정보가 사라짐

차이점

  1. 저장위치 - 쿠키는 로컬에, 세션은 로컬과 서버에 저장
  2. 보안 - 쿠키는 탈취와 변조 가능, 세션은 ID로 인증하기 때문에 상대적으로 안전
  3. Lifecycle - 쿠키는 브라우저를 종료해도 파일로 남아있지만 세션은 브라우저 종료시 세션 삭제
  4. 속도 - 쿠키는 파일에서 읽기 때문에 상대적으로 빠르고 세션은 요청마다 서버에서 처리를 해 비교적 느림

HTTP 1.0은 비연결성, 1.1부터는 keep-alive로 지속커넥션이 가능하므로 연결성으로 볼 수 있을 것 같습니다..
초기 HTTP가 비연결성, 무상태성의 특징을 가졌기 때문에, 이를 보완하기위해 각각 keep-alive / 쿠키와 세션 등의 기능이 추가되었습니다.

쿠키는 브라우저에 저장되는 사용자에 대한 정보이고, 세션은 서버 쪽에 저장되는 사용자에 대한 정보입니다. 쿠키는 브라우저를 종료해도 남아있고, 세션은 세션 종료시 삭제됩니다.