토큰을 사용하는 이유

2023. 7. 3. 00:57Web

728x90

로그인을 세션으로 구현한다고 하면 주변에서 시선이 느껴지는 경험을 다들 해본 적이 있을 것이다.

그렇다면 쿠키와 세션으로 로그인을 구현하면 도대체 어떤 문제가 발생하길래 다들 이렇게 반응하는 걸까??

 

지금부터 쿠키와 세션으로 로그인을 구현하는 방법과 각각의 한계에 대해서 알아보고, 이를 극복할 수 있는 토큰을 사용하여 로그인을 하는 법에 대해서 알아보도록 하겠다.

 

먼저, 쿠키를 사용하는 방식이다.

 

쿠키

위키백과에서 쿠키에 대한 정의는 아래와 같다.

 

HTTP 쿠키(HTTP cookie)란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우
사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일

필자는 쿠키는 데이터를 담는 그릇이라고 이해했다.

 

쿠키를 사용해서 인증, 인가하는 방식은 다음과 같다.

 

  1. ID, Password로 로그인 수행
  2. 서버가 쿠키를 생성해 쿠키에 ID,PW를 담아서 쿠키를 브라우저에 넘겨준다.
  3. 브라우저는 동일한 서버로 재요청시마다 제공받았던 쿠키를 함께 전송한다.

이렇듯 쿠키에 ID와 PW 정보를 담아 전송한다. 

이 방식은 브라우저에 쿠키에 대한 정보가 남아있기 때문에 보안에 취약하다.

 

 

세션

세션의 정의는 아래와 같다.

 

세션(session)이란 웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법을 의미한다.

 

필자는 세션에 대해서 아래와 같이 이해했다.

 

  • 서버 측에 데이터를 저장하고 이에 대한 키 값만을 클라이언트에 넘겨준다.
  • 세션의 한 주기는 브라우저가 서버와의 연결을 끊는 시점 "즉, 브라우저를 닫는 시점까지" 이다.

 

세션을 사용하여 인증, 인가하는 방법은 다음과 같다.

 

  1. ID, Password로 로그인 수행
  2. 세션에 ID,PW를 저장하고 이를 식별하는 세션 ID를 쿠키에 담아서 보낸다.
  3. 앞으로 서버에 요청할 때 세션 ID를 함께 전송한다.
  4. 제공받은 세션 ID로 어떤 사용자인 지 구분한다.

 

세션에 저장하는 방식은 2가지가 존재한다.

 

1. 서버 내부의 Session 저장소를 이용

 

이 방법을 사용하면, 서버의 Scale out이 어려워진다.

 

 

먼저, Scale out은 서버를 추가해 확장하는 방식이다. 

(기존 서버만으로 용량이나 성능의 한계가 도달했을 때 사용하는 방법 중 하나)

 

왜 Scale out이 어려워질까??

 

세션을 이용하면, 요청을 받은 서버의 내부 Session 저장소에 해당 정보가 저장된다.

하지만, Scale out을 한다고 할 때 Scale out을 해 새로 증설한 서버는 다른 서버에 있는 세션 정보가 없다.

이를 해결하기 위해서는 모든 서버의 Session 저장소를 동일하게 유지하던가, Load Balancer를 이용하여 이전에 통신했던 서버로 요청을 핸들링 해줘야한다.

 

세션 방식은 ID, PW를 서버에서 관리하가기때문에 쿠키보다 보안상 안전하다. 하지만, Session Id 또한 탈취 위험성이 존재하고 무엇보다 이 방식은 Stateless하여 Scale out이 어렵다.

 

토큰

 

토큰은 일종의 신원확인, 혹은 본인 확인 수단으로 웹상에서 사용되는 인증 방법이다.

 

토큰을 사용하여 인증, 인가 하는 방법은 다음과 같다.

 

1. ID와 PW로 로그인한다.

2. 서버에서 해당 클라이언트가 앞으로 인증에 사용할 토큰을 만들어 클라이언트에게 부여한다.

3. 클라이언트는 서버에서 제공받은 토큰을 요청할 때 함께 전송한다.

4. 서버는 토큰을 검증하여 요청에 응답한다.

 

위의 과정에서 사용하는 토큰을 AccessToken이라 한다. 

 

토큰은 토큰 자체에 데이터가 들어있고 이는 클라이언트에서 관리되기 때문에서 서버의 부담이 줄어든다.

또한, 토큰의 Payload는 암호화 되어 있지 않기 때문에 중요한 정보는 담지 않는다. 따라서, 올바르게 사용한다면 쿠키보다 보안상 안전하다고 할 수 있다.

그리고, Stateless하기때문에 서버의 확장에 제한이 없다.

 

그러나, 토큰 또한 탈취당할 수 있다. 이는 토큰의 사용 기간 제한을 짧게 설정하는 것으로 극복한다.

그리고, 쿠키와 세션에 비해 데이터의 크기가 커 네트워크 부하가 심해질 수 있다.

 

토큰은 웹과 서버가 인증할 때 가장 많이 사용되는 데, 웹 상에서는 쿠키와 세션이 있지만 앱에서는 없기 때문이다.

대표인 토큰으로 JWT가 있다.

 

https://rasony.tistory.com/126

 

JWT에 대하여

JWT(Json Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 HMAC, RSA, ECDSA등으로 서명되어 있어

rasony.tistory.com

 

다음 포스팅에서는 AccessToken과 RefreshToken에 대해서 알아보고 JWT로 로그인을 구현하는 방법을 포스팅하겠습니다.

 

728x90

'Web' 카테고리의 다른 글

DNS(Domain Name System)  (0) 2024.01.21
토큰을 사용한 인증과 인가  (0) 2023.07.10
Postman에서 토큰 자동 설정하는 방법  (1) 2023.05.14
배치(Batch)란?  (0) 2023.04.06
동기 비동기 개념  (0) 2023.04.06