Cookie + Session 조합 (DB로 보안강화까지)

H·2024년 1월 8일
post-thumbnail

단 한번 로그인으로 브라우저를 닫아도 로그인 상태를 유지하는 방법?
위시리스트에 아이템 저장하는 법?


HTTP의 상태 저장: 쿠키의 등장

HTTP는 상태를 저장하지 않는 프로토콜로, 클라이언트와 서버 간의 각 요청이 독립적이어서 상태 정보를 기억하지 못한다.

독립적인 요청이란 ?

사용자가 브라우저를 열고 웹페이지에 접속하면, 서버는 그 요청을 받아들이고 해당 페이지를 제공하는데, 이때 서버는 클라이언트의 상태를 기억하지 않습니다.
사용자가 다른 페이지로 이동하거나 새로고침을 실행하면, 각각의 요청은 이전 요청과 독립적으로 처리됩니다. 서버는 클라이언트에 대한 어떠한 정보나 상태도 기억하지 않습니다.
그렇기 때문에 로그인을 했다거나 장바구니에 뭘 추가한 것을 서버는 기억하지 못한다.

그러나 쿠키가 등장함으로써 서버는 클라이언트에 작은 데이터 조각을 보내 상태 정보를 저장할 수 있게 되었습니다. 사용자가 로그인한 상태를 유지할 수 있도록 하여, 이전에는 로그인이 필요한 각 페이지에서 반복되었던 재인증 과정을 없애고 사용자 경험을 향상시켰다.

사용자의 세션 상태는 쿠키를 통해 저장되어, 웹사이트를 떠나 다른 페이지로 이동하더라도 로그인 상태가 유지된다.

사용자의 컴퓨터에 마치 과자 부스러기가 남아 있는 것과 같다고 해서 '쿠키(cookie) 🍪'라는 명칭이 붙여졌다.


쿠키(cookie)

  • 브라우저에 접속할 때 서버에 의해 사용자의 컴퓨터에 저장되는 정보를 의미.
    즉 , 쿠키를 사용하면 서버는 사용자의 브라우저에 데이터를 넣을 수 있다.
  • HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용
  • 유효 시간을 설정하면 브라우저가 종료가 되어도 인증이 유지된다.

쿠키가 가지는 목적

  1. 세션관리 : 서버에 저장해야할 로그인, 장바구니 등

  2. 개인화 : 각 사용자 적절한 페이지를 보여줌 (사용자 선호, 테마 등)

  3. 트래킹 - 사용자의 행동과 패턴 분석 및 기록


세션(Session)

쿠키는 클라이언트 측의 컴퓨터에 모든 데이터를 저장한다면,
세션은 서비스가 돌아가는 서버 측에 데이터를 저장하고, 세션의 키값만을(session id) 클라이언트 측에 남겨둔다.
브라우저는 필요할 때마다 이 키값을 이용하여 서버에 저장된 데이터를 사용하게 됩니다.(session id를 담은 쿠키 전달)
이러한 세션은 보안에 취약한 쿠키를 보완해주는 역할을 하고 있다.

아래 그림과 설명을 보면 이해하기 쉽다


쿠키(cookie)/세션(session) 작동 방식

쿠키는 요청(request)과 함께 움직이며
클라이언트와 서버 사이에서 세션id(입장권)를 전달하기 위한 매개체 역할을 합니다.

<로그인 요청>
클라이언트에서 로그인 요청을 위해 id와 비번 서버로 보냄
-> 아이디,비번일 일치하면 서버는 session db에 해당 사용자를 등록하고 session id를 생성
-> 이 session id는 쿠키를 통해 브라우저로 돌아와 저장된다.

<페이지 이동 요청>
브라우저는 세션 id를 가지고 있는 쿠키를 다시 서버에 보냄
-> 서버는 쿠키보고 요청이 있다는 걸 확인함
-> 쿠키에 담긴 해당 세션 id와 세션db 일치여부 확인
-> 일치하면 서버는 해당 유저인걸 확인하고 페이지를 띄움

모든 사용자 정보는 서버에 저장되고 사용자가 가지고있는것은 세션id 일 뿐이다.


보안 문제

쿠키는 클라이언트 측에 저장되는 값으로, 사용자가 마음대로 쿠키를 탈취하거나 조작할 수 있는 보안적인 취약점이 존재한다. 특히 중요한 사용자 정보나 권한과 관련된 세션 데이터를 클라이언트에 저장할 경우, 정보가 노출되면 보안 문제가 발생한다.

서버 측 데이터베이스에 세션을 저장하는 것은 보안적인 측면에서 더욱 강력한 해결책으로 작용한다. 중요한 세션 정보를 DB에 안전하게 저장하면 사용자가 직접적으로 접근하거나 조작할 수 없으며, 신뢰성 있는 보안 환경을 구축할 수 있다.

만료시간을 적절히 설정하는 것도 하나의 방법이다.
중요한 데이터를 다루는 경우에는 만료시간을 짧게 유지하는 것이 안전하다.

라이프 사이클, 쿠키도 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아 있을 수 있다. 또한 만료기간을 길게 설정해두면 쿠키삭제를 할 때 까지 유지될 수도 있다.
반면에 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다.


결론

서버는 'abcde123456'라는 이름으로 세션ID를 클라이언트에 저장해놓으면
클라이언트는 앞으로 모든 요청 헤더에 이 쿠키 값을 포함시켜 보내고 서버가 식별한다.

쿠키는 만료시간이 되면 클라이언트측에서 소멸되니까 동일한 클라이언트가 보낸 요청이라고 해도 서버는 새로운 클라이언트로 인식하게 된다.
하지만 이전에 서버측에 생성된 세션 정보는 유지될 수 있다.

세션과 쿠키를 비교해보자면
보안 면에서 세션이 쿠키보다 우수하고, 요청 속도는 쿠키가 세션보다 더 빠르다.
그 이유는 세션은 서버의 처리가 필요하기 때문.

세션, 쿠키, 데이터베이스의 조합은 보안성과 성능을 균형있게 유지하는 효과적인 전략이지 않을까 싶다!

로그인 구현 코드로 실행해보려면 const 로그인 = [Next-Auth, 세션, DB 어댑터]글을 참조해주세요!

틀린부분이 있으면 댓글로 부탁드립니다🥲


참조

profile
Hello

0개의 댓글