[인증&인가] - Session | Token

Na Jeong·2022년 12월 3일
0

인증&인가

목록 보기
1/2
post-thumbnail

사용자와 시스템간 데이터를 교환하기 위해 HTTP 방식을 사용한다. HTTP 통신은 요청과 응답에 의해 동작하며, HTTP 특징 중 가장 중요한 특징은 Stateless이다.

각각의 HTTP 통신은 독립적이기 때문에 과거의 통신에 대한 내용을 알지 못한다. 이전의 상태를 전혀 알지 못하면 매 통신마다 필요한 모든 정보를 담아서 요청을 보내야 한다.

이런 불편함을 없애기 위해 일부 정보에 대해서 Stateful 상태를 유지할 필요가 있다. 이를 위해서 Session과 Cookie 또는 Token 같은 기술을 사용할 수 있다.

📓Session과 Token

📘Session

클라이언트가 브라우저를 통해 웹 서버에 접속한 시점으로부터 브라우저를 종료하여 연결을 끝내는 시점 동안 클라이언트와 웹 서버가 논리적으로 연결된 상태이다.

서버는 Session 정보를 저장하고 클라이언트에게는 Session을 구분할 수 있는 Session ID를 부여한다. 이것을 Session ID라고 한다.

클라이언트 Request를 보낼 때 해당 Session ID를 함께 보냄으로써, 클라이언트의 상태를 확인할 수 있다.

Cookie는 클라이언트의 컴퓨터에 저장되는 데이터 파일이다.

Cookie에는 이름, 값, 만료 날짜/시간, 경로 정보등으로 구성이 되어있다. Cookie는 하나의 도메인 당 20개를 가질 수 있으며, 1개 당 4Kbyte를 넘길 수 없다.

서버에서는 HTTP Resonse Header에 Set-Cookie 속성을 이용해 클라이언트에 Cookie를 제공하여 저장하게 하고, 클라이언트는 HTTP Request에 저장된 Cookie를 함께 전달하여 이전의 통신에서 사용된 정보들을 파악할 수 있다.

사용자별로 다른 정보를 표시하는 것이 가능하며, 사용자의 행동과 패턴을 분석할 수 있다.

📓Session과 Cookie를 이용한 인증 Flow

  • 사용자가 로그인을 하기 위해 인증 정보를 가지고 인증 과정을 요청한다.
  • 인증이 완료 되면 사용자의 Session 정보를 서버의 메모리에 저장 후 해당 Session을 식별할 수 있는 Session ID를 발급한다.
  • 발급한 session ID가 Cookie에 저장될 수 있도록 HTTP Response Header의 Set-Cookie 속성을 이용하여 사용자에게 전달한다.
  • 전달받은 session ID는 브라우저의 Cookie에 저장되고, request를 서버에 보낼 때 함께 전달된다.
  • 서버는 사용자가 보낸 session ID와 서버 메모리에서 관리하고 있는 session ID를 비교하여 verification을 수행 후 권한을 인가한다.

📓Session 기반 인증의 특징

📘장점

  1. session ID 자체에는 유의미한 개인정보를 담고 있지 않다.
  2. 서버에서 정보를 관리하기 때문에 데이터의 손상 우려에 대해 상대적으로 안전하다.
  3. 서버에서 상태를 유지하고 있으므로, 사용자의 로그인 여부 확인이 쉽다.
  4. 경우에 따라서 강제 로그아웃 등의 제재를 가할 수 있다.

📘단점

  1. 서버에서 모든 사용자의 상태를 관리해야 하므로 사용자의 수가 증가할 수 록 서버에 가해지는 부하가 증가한다.
  2. 사용자가 증가하여 서버의 Scale Out(규모확대)를 해야할 때 session관리가 어려워진다.
  3. 모바일 기기와 브라우저에서 공동 사용할 때 중복 로그인 처리가 되지 않는 문제 등 신경 써야할 부분이 증가한다.

📓Token

Token의 사전적 의미는 버스 요금이나 자동판매기 등에 사용하기 위하여 상인, 회사 등에서 발행한 동전 모양의 주조물이다.
웹에서의 토큰도 이와 비슷한 의미를 가지고 있다.
웹에서 토큰을 가지고 있으면 해당 서비스를 이용할 수 있는 권리가 있다고 간주한다.

자세히 말하면,
Token은 제한된 리소스에 대해 일정 기간 동안 접근할 수 있는 권한을 캡슐화 한것이다.
Token은 일반적으로 의미를 알 수 없는 임의의 문자열 형태로 사용자에게 발급한다. 또한, 제한된 리소스에 대한 접근 권한을 캡슐화할 뿐만 아니라 접근할 수 있는 리소스의 범위와 접근 가능한 기간도 통제가 가능하다.

📓Token을 이용한 인증 Flow


1. 사용자가 로그인을 하기 위해 인증 정보를 가지고 인증 과정을 요청한다.
2. 인증이 완료되면 서버의 메모리에 session을 저장하는 대신에 사용자의 식별 정보를 가지고 있는 Token을 발급한다.
3. 발급한 Token은 Response의 body에 담아 사용자에게 전달한다.
4. 사용자는 발급된 Token을 local storage에 저장한다.
5. 사용자는 Request를 할 때마다 저장된 토큰을 Header에 포함시켜 서버로 보낸다.
6. 서버는 사용자로부터 전달받은 Header의 토큰 정보를 Verification한 뒤, 해당 유저에 권한을 인가한다.

📓Token의 특징

📘장점

  1. Token을 사용자 측에서 저장하므로 서버의 메모리나 DB등의 부담이 없다.
  2. 사용자의 상태 정보를 서버에서 관리하지 않기 때문에 서버의 Scale Out에 용이하다.
  3. 모바일과 브라우저의 멀티 환경에서 사용이 용이하다.
  4. Token의 만료 시간을 짧게 설정하여 안정성을 높일 수 있다.
  5. CORS 방식을 사용하기에 용이하다.

    CORS(Cross Origin Resource Sharing)란?
    우리가 가져오는 리소스들이 안전한지 검사하는 브라우저의 방화벽

📘단점

  1. 서버에서 사용자의 상태를 저장하고 있지 않기 때문에 사용자의 로그인 여부 확인, 경우에 따른 강제 로그아웃 등의 제재를 가하기 어렵다.
  2. 사용자가 임의로 토큰을 수정하거나 구조가 변경되게 되면 서버에서 확인할 수가 없다.
  3. Payload 부분에 사용자 식별을 위한 여러 정보들이 포함되어 있어 session ID의 길이보다 길어져 HTTP request 전송 데이터의 크기가 증가한다.
  4. XSS 공격에 취약하여 Payload에 민감한 정보를 포함하는 경우 위험할 수 있다.

📓Token based Authentication의 이점

📘Stateless

Session 방식처럼 상태 정보를 서버측에서 관리 하지 않고, 사용자 측에서 관리하기 때문에 서버의 상태를 Stateless하게 유지하게 된다. 따라서 서버측에서는 사용자로부터 받은 Request만을 가지고 작업을 수행할 수 있다.

📘Scalability

서버의 상태를 Stateless하게 유지한다는 것은 사용자와 서버 사이에 관계가 없다는 의미도 된다. 일반적으로 session 기반 인증에서는 로그인 상태를 유지하기 위해서는 최초 로그인 시에 Request한 서버로 계속 session ID를 보내주어야 한다.
하지만 Token 기반의 인증 방식은 이러한 관계가 존재하지 않기 때문에 서비스를 운영 중인 어떤 서버로든지 Request를 보낼 수 있다.
그래서 token 기반의 인증 방식을 사용하면 서버의 확장에 유리하다.

📘Security

클라이언트가 서버로 요청을 보낼 때 더 이상 Cookie를 전달하지 않으므로, CSRF 공격을 방지하는 데 도움이 된다.

CSRF(Cross-Site Request Forgery)는 악성 웹 사이트 공격 유형이다. CSRF 공격을 원클릭 공격 또는 세션 라이딩 이라고도 한다. 이 공격 유형은 웹 사이트가 신뢰하는 사용자로부터 권한 없는 요청을 전송한다.

하지만 토큰 환경의 취약점이 존재할 수 있으므로 이에 대비해야 한다.

📘Extensibility

Token 기반의 인증 시스템에서는 토큰을 통해 권한의 범위를 지정할 수 있다.
이를 이용하여 Kakao, Facebook, Google 등과 같은 소셜 계정을 이용해 다른 웹서비스에서도 로그인이 가능하다.

📘Multiple Devices and Domains

서버 기반 인증 시스템의 문제점 중 하나인 CORS를 해결할 수 있다.
애플리케이션과 서비스의 규모가 커지면 여러 기기들을 호환시키고 더 많은 종류의 서비스를 제공하게 된다.
토큰을 사용한다면 어떤 기기, 어떤 도메인에서도 토큰의 유효성 검사를 진행한 후에 요청을 처리할 수 있다.

profile
끊임없이 노력하는 프론트엔드 개발자 (⸝⸝⍢⸝⸝) ෆ

0개의 댓글