Infra 전반/실전압축지식

[실.압.지]쿠키/캐시/세션/토큰이란 무엇인가?(Cookie, Cache, Session, Token)

faru 2024. 9. 26. 15:45

[1.짧게 말해서]

쿠키, 캐시, 세션, 토큰은 정말 많이 사용되는 단어이다. 찾아보지 않으면 그 놈이 그 놈같아서 헷갈리는 경우가 많아 정리해놓을 필요가 있다. 

공통적으로, 모두 반복되는 작업(데이터 불러오기)을 피하고 웹 환경에서 효율적인 자원 사용과 속도를 위해 사용된다.

자주 사용하거나, 한 번 사용했던 웹페이지의 데이터나 정보를 용도에 맞게 재활용하기 위해 사용되는 것들이다.

 

쿠키(Cookie): 쿠키는 클라이언트 측에서 관리되는 작은 텍스트 파일로, 사용자의 웹 브라우저에 저장된다. 쿠키는 사용자가 웹사이트를 방문할 때마다 서버에 전송되어, 사용자를 식별하거나 사용자의 선호 설정 등을 저장하는데 사용된다.



세션(Session): 세션은 서버 측에서 관리되는 사용자 정보이다. 사용자가 웹사이트에 로그인하면, 서버는 세션 ID를 생성하고 이를 쿠키를 통해 사용자에게 전송한다. 사용자가 웹사이트를 방문할 때마다, 쿠키의 세션 ID를 통해 사용자를 식별하고 사용자 정보를 관리한다.



토큰(Token): 토큰은 인증 및 권한 관리에 사용되는 암호화된 문자열이다. 사용자가 로그인하면, 서버는 사용자의 인증 정보를 암호화하여 토큰을 생성하고 이를 사용자에게 전송한다. 사용자는 이 토큰을 이용해 서버의 리소스에 접근할 수 있다.



캐시(Cache): 캐시는 데이터나 값을 빠르게 접근하기 위해 사용하는 임시 저장소이다. 한 번 데이터를 가져오는데 시간이 많이 소요되는 경우, 그 데이터를 캐시에 저장해두면 다음에 같은 요청이 들어왔을 때 빠르게 응답할 수 있다.

(캐시에 대한 자세한 설명:

2024.09.25 - [Infra 전반/실전압축지식] - [실.압.지]Cache란 무엇인가?(Cache서버란)

 

[2. 조금 더 자세하게]

1.쿠키 

쿠키는 업무하는 도중이 아니더라도, 웹서핑중 많이 본 적이 있을것이다. 

'쿠키 정보 활용에 동의하십니까?' 또는 stackoverflow 사용 시  아래와 같은 화면을 많이 보게 된다.

쿠키는 우리가 사용하는 크롬, 파이어폭스 등의 브라우저에 생성되고 관리하는 작은 텍스트 파일이다. 웹사이트는 이 쿠키를 사용하여 사용자의 선호 설정, 이력, 방문했던 페이지 등을 기억하고 사용자가 웹사이트를 방문할 때 이 쿠키정보를 이용한다.

어떤 상품을 클릭했는지, 어떤 메뉴에 자주 들어가는지 등의 정보가 저장되기에 마케팅에 이용하기도 하고, 사용자의 편의를 위해 사용자가 한 번 설정한 웹페이지의 환경설정을 저장해두기도 한다.(폰트크기, 다크모드, 배경색 등)

또한, 밑에서 설명하겠지만 로그인 세션 유지를 위해 사용된다.

 

하지만, 사용자의 개인정보가 남기 때문에 사용자의 동의를 받는게 원칙이며, 중요하고 민감한 정보는 저장하지 않아야 한다.

 

2. 세션(Session)

세션은 쉽게 생각해서, 웹 페이지(서버)에서 고객(Client)가 로그인 했는지 안했는지 확인할 수 있는 방법이다. 

 

웹페이지는 로그인을 해야 사용가능한 동작들이 많다. 쇼핑몰을 예로들면, '마이페이지', '내가 찜한 상품', '주문목록' 등의 기능들일 것이다. 이러한 기능을 이용하기 위해  ID, Password 입력 후 로그인 버튼을 클릭했다고 가정하자.

브라우저는 웹서버에 로그인 정보를 전송하고, 로그인이 완료된다. 그 후, 마이페이지 버튼을 클릭한다. 당연히 마이페이지 화면에 접속될 것이다.

하지만, 이런 클릭 하나하나는 서버 입장에서는 무작위로 오는 새로운 요청에 불과하다. 즉, 유저가 로그인에 성공한 후 마이페이지를 누르는 것인지, 그냥 누른 것인지 알 수 없다는 것이다. 다음 그림을 참조하자.

즉, 로그인 했다는 사실을 쇼핑몰 웹서버에 인증해야만 정상적인 기능을 사용할 수 있고 이 때 사용하는 것이 바로 '세션' 이다. 만약 세션 기능이 없다면, 로그인 후 사용가능한 모든 기능을 누를 때마다, 로그인 정보를 매번 입력해야 하는 번거로움이 생길 것이다.

 

세션은 유저가 로그인 했다는 사실을 증명하는 일종의 증서이다. 호텔 체크인 후 키를 받은 것과 비슷하다. 체크인 후 매번 외출 할 때마다 로비에 방문할 수는 없는 노릇인 것처럼, 사용자가 한 번 로그인 하면 만료기간이 끝날 때까지 세션 ID 이라는 증서를 발급해주는 것이다.

 

세션은 Key에 해당하는 Session ID와 이에 Mapping되는 Value 값으로 이루어져 있다. Value값에는 로그인정보, 세션 생성시간, 만료시간, 유저 정보등이 map 형태로 저장되어 있다. 서버는 유저가 로그인을 하면, 다음과 같이 세션객체를 생성 한뒤 저장하고, 유저에게는 세션 ID만 전달한다.

(보통 해당 객체는 메모리에 저장되며, 추후 세션을 저장하는 방식에 대해서도 포스팅 하겠다. 일단은 서버에서 세션 정보를 저장하고 있다고 생각하자)

다음과 같은 과정을 거쳐 세션이 발급되고 사용된다.

 

3. 토큰(Token)

토큰 역시 세션과 마찬가지로 로그인 유지 관리를 위해 사용되는 대표적인 방식중의 하나이다. 토큰 방식의 동작원리는 심플하다. 서버 측에 토큰 생성&검증 가능하도록 기능을 구성하고, 유저(client)측에서 로그인 요청이 왔을 시, 토큰을 생성하여 유저에게 전달한다. 이 때, 토큰은 쿠키 또는 로컬스토리지, 세션 스토리지에 저장된다.

그리고 유저는 발급받은 토큰을 이용하여 로그인 했음을 증명한다. 

 

언뜻 세션 방식과 동일해 보이지만, 가장 큰 차이점은 데이터가 저장되는 방식의 차이점이다. 세션 방식의 경우, 사용자의 로그인 정보, 발급 시간, 만료 시간, 또는 상황에 따라 사용자의 사용 기록(장바구니, 방문페이지 등)이 서버측의 메모리에 저장된다. 반면에 토큰의 경우, 인증에 필요한 정보를 암호화 하여 사용자에게 전달하고 사용자 측에서 토큰을 저장한다. 즉, 토큰 방식의 경우 서버측에 토큰 인증을 위한 별도의 데이터를 저장하지 않는다는 것이다.

토큰 발급 및 검증은 수학적 알고리즘에 의해 이루어지며 해당 작업은 해당하는 서버에서만 이루어질 수 있다.

세션 방식과 다르게 별도의 인증을 위한 데이터와 사용자 정보를 메모리 위에 올려놓지 않기 때문에, 서버의 부하를 줄일 수 있고  서버의 확장성을 늘리는데도 유리하다.

 

정리하면, 

- 세션 방식에서는 사용자가 로그인을 하면, 서버는 사용자의 고유한 세션 ID를 생성하고 이를 메모리나 데이터베이스 등에 저장.

- 세션 ID는 사용자의 로그인 상태, 권한 정보, 사용자 설정 등 사용자와 관련된 다양한 정보를 관리하는데 사용.

- 사용자는 이 세션 ID를 쿠키를 통해 받아서 보관하고, 서버에 요청을 보낼 때마다 이 세션 ID를 함께 보내서 자신을 인증하고 서버는 받은 세션 ID를 통해 사용자를 식별하고, 저장해둔 세션 정보를 통해 사용자의 상태를 유지.


- 토큰 방식에서는 사용자가 로그인을 하면, 서버는 사용자의 인증 정보를 암호화하여 토큰을 생성하고 이를 사용자에게 전달.

-이 토큰은 사용자의 인증 정보와 권한 정보 등을 포함. 사용자는 이 토큰을 클라이언트 측에서 보관하고, 서버에 요청을 보낼 때마다 이 토큰을 함께 보내서 자신을 인증.

- 서버는 받은 토큰을 복호화하여 사용자를 식별하고, 토큰에 포함된 정보를 통해 사용자의 권한을 확인. 서버는 토큰을 별도로 저장하거나 관리하지 않으며, 토큰이 유효한지만을 검증.

 

따라서, 세션 방식은 서버가 사용자의 상태를 유지하고 관리하는 반면, 토큰 방식은 서버가 사용자의 상태를 유지하지 않는 차이가 존재한다. 이는 세션 방식이 서버 중심적인 방식이고, 토큰 방식이 클라이언트 중심적인 방식이라고도 할 수 있다.



세션 방식의 장점:

  • 서버 측에서 사용자의 상태를 관리하므로, 사용자의 상태 정보를 실시간으로 업데이트하거나 관리하기 쉽다.
  • 사용자의 민감한 정보는 서버 측에서만 관리하고, 클라이언트에는 세션 ID만 전달되므로 정보 노출의 위험이 적다.(물론 세션 ID가 탈취 당하는 경우는 예외이다..)


세션 방식의 단점:

  • 사용자가 많아질수록 서버의 부하가 증가하며, 확장성에 제한이 있을 수 있다.(서버 메모리 위에 정보를 올리므로)
  • 세션 ID가 탈취되면, 해당 세션 ID로 사용자를 가장하는 보안 위험이 있다.

토큰 방식의 장점

  • 사용자 정보를 클라이언트 측에서 관리하므로, 서버의 부하를 줄이고 확장성을 높일 수 있다.
  • 토큰은 암호화되어 있어, 토큰이 탈취되더라도 내부의 정보를 쉽게 볼 수 없다.

 

토큰 방식의 단점

  • 토큰에는 최소한의 정보만 포함되므로, 사용자의 상세 정보가 필요할 때마다 데이터베이스에서 조회해야 한다.
  • 토큰이 탈취되면, 해당 토큰으로 사용자를 가장하거나 권한을 부여받을 수 있다.
  • 사용자 정보 실시간 업데이트가 불가능하다.
    예를들어, 사용자 전체를 로그아웃 시키고 싶을 경우 세션 방식의 경우 강제로 로그아웃이 가능하지만 토큰 방식의 경우 통제할 방법이 없다.