세션과 토큰 쿠키

들어가며

이번 포스트에서는 세션과 토큰 쿠키의 대하여 알아봅니다.

웹서비스를 구축하다보면 세션과 쿠키 , 어플리케이션과 통신할 때는 토큰을 사용할 때 가 있습니다.

최근에 vue.js로 작업을 해보며 State management 라이브러리 를 사용하면서

세션과 쿠키를 활용한 정보전달 방식 뿐 아니라 다른 방법으로도 구현할 수 있다는 것도

알게 되었는데 일단, 이번 포스트에서는 백엔드 기준에서 어떤 식으로 구현해 볼 지에 대한 개념적인

설명을 할 것 입니다.

Cookie

 

쿠키는 웹사이트가 사용자의 컴퓨터나 모바일 기기에 저장하는 작은 텍스트 파일입니다.

쿠키는 사용자의 로그인 정보, 선호도, 설정 등을 저장하여 사용자 경험을 향상 시키는 데 사용됩니다.

크게 3가지 분류로 쿠키의 종류를 파악하는데

필수 쿠키

웹사이트가 제대로 작동하기 위해 필요한 쿠키입니다. 예를 들어, 로그인 정보를 저장하거나 사용자의 장바구니 내용을 기억하는 데 사용됩니다.

기능 쿠키

웹사이트의 기능을 향상 시키는 데 사용되는 쿠키입니다. 예를 들어, 사용자의 선호하는 언어를 설정하거나 사용자의 위치를 기반으로 날씨 정보를 제공하는 데 사용됩니다.

추적 쿠키

사용자의 웹 활동을 추적하는 데 사용되는 쿠키입니다. 이 정보는 사용자에게 맞춤 광고를 제공하는 데 사용될 수 있습니다. 이런 방법을 트래킹 이라고 하는데 사용자를 분석하고 광고를 타켓팅하는 용도로 사용됩니다.

고대 쿠키

아주 예전 개발자들은 이 쿠키를 사용해서 클라이언트 측에 정보를 저장할 때 사용하곤 했는데요

사실 쿠키라는 것은 파일이기 때문에 사용자가 열어볼 수 도 있고, 만약 암호화를 했다고 해도

악의적인 사용자가 그런 쿠키 정보를 수집해서 해독하면 보안 상 큰 문제가 발생할 수 도 있습니다.

따라서 최근에는 storage APIs 를 사용해 정보를 저장하는 것을 권장하는데

이것은 web Storage 라고 부릅니다.

web storage

이런 web storage 는 크게 2가지가 있습니다.

SessionStorage

세션에 한정해 , 즉 브라우저가 닫히기 전까지만 데이터를 저장합니다.

이런 데이터는 서버로 전송하지 않습니다.

localStorage

유효기간 없이 데이터를 저장합니다. js 또는 브라우저캐시 , 로컬 파일을 지워야 사라집니다.

당연히 이런 데이터는 보안상 민감하지 않은 데이터들 , 예를 들어 어떤 페이지에 들어온 것, 로그인하지 않고 장바구니에 어떤 데이터를 담는 이런 데이터만을 취급해야합니다.

어찌 되었든 쿠키는 보안상 문제를 발생시킬 가능성이 있어서 , 사용자가 특정 쿠키만 허용, 혹은 차단하도록 유도하는 기능이 대부분에 사이트에 있습니다.

그리고 이런 방법을 극복하기 위해 Session이라는 방법을 알아봐야 합니다.

Session

세션은 웹 서버와 클라이언트 (사용자 컴퓨터) 간의 일련의 상호 작용을 의미합니다.

사용자가 웹 사이트를 방문하면 서버는 사용자를 식별하고 이전 요청과 현재 요청을 연결하기 위해 세션을 생성합니다.

세션은 사용자의 로그인 정보, 쇼핑 장바구니 내용, 방문 페이지 기록 등을 저장하는 데 사용됩니다.

즉, 사용자의 개인정보를 보호 하는데는 더욱 효과적입니다.

저도 햇갈렸습니다.

여기서 간혹 햇갈리시는 분이 있는데 세션이라는 의미는 ‘기간’,’시간’ 이라는 의미입니다.

결국 세션은 통신 과정 중 어느 시간 동안 통신을 하는 상호작용을 의미하는 것이지

쿠키 처럼 어느 공간에 저장한다는 의미는 아닙니다.

즉, 세션은 세션을 저장해둘 세션 저장소를 필요로 하고 보통 DB 를 기반으로 만듭니다.

이것도 알아보자

아주 러프하게 서버 파일로 관리를 할 수도 있는데요, 서버가 하나인 경우에는 가능합니다.

그런데 최근 개발자들은 MSA - macrio service architecture 방식으로 서비스를 설계하는데요

어려운 의미는 아니고 원래 하나의 큰서비스를 구축한다면 각각의 컴포넌트를 작게 나누어 각각 관리를 한다는 의미입니다.

그래서 docker , kubernetes 같은 컨테이너 - 컨테이너 관리 서비스들도 각광받고 있는 것 이구요.

따라서 db 서버를 운영하는 것이 최근 트렌드에서는 맞는 선택이라고 생각합니다.

예전에는 서비스가 크지 않았기 때문에 하나의 서버로도 감당이 가능해서 상남자 스타일로 구현하시는 분들도 있다고 수업시간에 들어본적은 있긴 한데 제가 생각 했을 때는 좋은 방법은 아닙니다.

session의 동작 방식

  1. 사용자가 웹 사이트를 방문하면 서버는 사용자를 식별하기 위해 고유한 세션 ID를 생성합니다.
  2. 세션 ID는 쿠키 또는 URL에 포함되어 사용자 컴퓨터에 저장됩니다.
  3. 사용자가 웹 사이트를 계속 방문하면 서버는 쿠키 또는 URL에서 세션 ID를 읽어 사용자를 식별합니다.
  4. 서버는 세션 ID를 사용하여 사용자의 세션 데이터를 찾아 사용자에게 맞춤화된 응답을 제공합니다.
  5. 사용자가 브라우저를 닫거나 웹 사이트에서 로그아웃하면 세션이 종료됩니다.

저장 방식 비교

그래서 세션을 쿠키에 저장하거나 아니면 url에 함께 보내는 방식이 있습니다.

뭐 페이지 수가 많지 않은 서비스 혹은, 상남자 개발자 라면 url에 사용하는 방법도 가능합니다.

제가 생각 했던 것을 정리해보면

쿠키를 사용하면 정보를 사용자 , 클라이언트 측에 저장해서 서버 부하가 줄고, 맞춤화된 서비스를 제공하는 data수집에 용의 합니다.

대신에 쿠키를 사용하지 않도록 거부하거나 저장된 데이터의 문제가 생길 가능성도 존재합니다.

반대로 url을 사용하면 서버부하가 늘고, 데이터 수집이 어려우며 보안의 문제점이 생길 가능성이 발생하지만 장점으로는 쿠키를 사용하지 않는 사용자도 이용할 수 있다는 점입니다.

그리고 쿠키는 자동으로 서버에 실어서 보내지기 때문에 따로 구축을 하지 않아도 된다는 점도 있습니다.

따라서 선택은 각 개발자의 몫이지만 , 제가 생각했을 때는 쿠키를 활용하는 방식이 더 좋아 보입니다.

쿠키 vs 세션

위 글을 읽고 정리해보면 다음과 같습니다.

쿠키는 사용자 컴퓨터 혹은 기기의 저장하고 이런 정보는 보안상 문제가 되자않는 정보를 위주로 저장한다.

세션은 서버 컴퓨터의 저장하고 보안상 문제가 있을 데이터를 안전하게 제공한다.

하지만 세션은 서버를 사용하기 때문에 서버의 부하가 발생할 가능성 + 비용 증가를 유도한다.

이렇게 정리해보면 됩니다. 그리고 최근에는 토큰이라는 방법도 있는데요 이것도 한번 알아보겠습니다.

토큰

토큰은 어떤 이상하고 긴 문자열 입니다.

암호환된 문자열을 만들어서 길고 무작위로 적힌 것 같은 문자열로 보여집니다.

이렇게 쓸 수 있는 이유는 쿠키는 사실 저장하는 공간의 제한이 있습니다.

브라우저마다 다르지만 최대 10MB를 넘는 일은 없습니다.

따라서 토큰을 사용해서 이런 문제를 해결할 수 있습니다.

그리고 가장 큰 목적은 어플리케이션 환경에서도 이런 쿠키를 사용하는 방법을 활용하기 위해서 입니다.

어플리케이션의 경우 쿠키를 사용할 수 없습니다. 이런 쿠키는 브라우저 기반으로 동작하게 되니까요

위에서 설명했던 모바일 기기는 말 그대로 모바일 기기로 브라우저에 접속한 경우를 말합니다.

따라서 토큰을 사용해서 서버와 통신하게 됩니다.

종류

  • JWT (JSON Web Token)
  • 사용자 인증 및 정보 전송에 사용되는 표준 토큰
  • OAuth 토큰
  • API 액세스 권한 부여에 사용되는 토큰
  • 암호화폐 토큰
  • 블록체인 기반 암호화폐 또는 가상화폐

저는 JWT 방식을 로그인 기능과 API Access 기능을 구현하기 위해 사용해봤는데요

https://github.com/Team-LifeTales/

상당히 유용한 방식으로 구현이 가능합니다.

JWT에 대해서는 다음 포스트에서 다루어보겠습니다.

정리하며

이번 포스트에서는 세션과쿠키 , 토큰에 대해서 알아봤습니다.

사실 저는 프론트와 백엔드에 관심이 있어서 토큰을 사용해본 경험은 JWT 정도 입니다.

따라서 개념적인 이해는 있어도 실제로 사용해본 경험이 적어서 다른 블로그 글도 참고해서 이해해 보시는 게 좋을 것 같습니다.

'CS' 카테고리의 다른 글

lombok AllArgsConstructor를 안쓰는 이유  (0) 2024.10.08
IP 와 Port 그리고 Socket  (0) 2024.08.08
delete method는 form-data를 못쓴다.  (0) 2024.08.07
Process 와 Thread  (0) 2024.06.10
DAO - DTO 차이점 생각해보기  (0) 2024.06.09