내부 Session vs token 차이

내부 Session vs token 차이?


개요


  • 현재 회사에 svc는 session 기반의 인증방식을 사용한다.
  • 그런데, 이를 token 기반으로 변경하려고 한다.

세션기반 인증 & 토큰기반 인증이란?


여기서 session 기반의 인증방식은 뭐고 token 방식의 인증방식은 뭘까?

1. 세션기반 인증

Untitled

세션기반 인증은 사용자의 인증 정보가 서버의 세션 저장소에 저장되는 방식이다.

  1. client ( 사용자 ) 로그인
  2. 로그인한 정보를 서버 세션에 저장 후 저장된 세션 정보의 식별자인 session id를 발급
    • 발급된 session id는 브라우저에 쿠키 형태로 저장되지만, 실제 인증 정보는 서버에 저장되어 있음
  3. 브라우저는 인증 절차를 마친 후 요청마다 HTTP Cookie 헤더에 session id를 함께 서버에 전송
  4. 서버는 요청을 전달받고 session id에 해당하는 세션 정보가 세션 저장소에 존재한다면 해당 사용자를 인증된 사용자로 판단

2. 토큰기반 인증

Untitled 1

토큰기반 인증은 인증 정보를 클라이언트가 직접 들고 있는 방식이다.

  1. client 로그인
  2. 서버에서 해당 로그인 정보로 토큰 발급 후 전달
  3. 해당 토큰을 브라우저의 로컬 스토리지에 저장
  4. 토큰 기반 인증 시 사용자가 가지고 있는 토큰을 http authorization 헤더에 실어서 전달
  5. 서버는 해당 토큰을 검증하고, 유효한 경우 요청에 대한 응답을 보냄

세션기반 인증과 토큰기반 인증에 대한 설명은 위와 같다.

눈에 보이는 차이는 사용자 정보를 client에서 관리하는지, 서버에서 관리하는지에 대한 차이인거같다.

session vs token


그렇다면 session 기반 인증과 token 기반 인증에 더 세부적인 차이점은 뭐가 있을까?

사이즈

세션의 경우 cookie 헤더에 세션 id만 실어 보내면 되므로 트래픽을 적게 사용한다.

하지만 토큰 기반은 사용자 인증 정보와 토큰 발급시각, 만료시각 등 담겨있는 정보가 세션 id에 비해 비대하므로 세션 방식보다 훨씬 더 많은 네트워크 트래픽을 사용한다.

안정성과 보안문제

세션의 경우 모든 인증 정보를 서버에서 관리하기 때문에 보안 측면에서 좀 더 유리하다. 모든 데이터가 서버에 저장되기 때문에 아무나 함부로 열람할 수 없게 된다. 설령 세션 id 가 해커에게 탈취된다고 하더라도, 서버측에서 해당 세션을 무효 처리하면 된다.

하지만 토큰의 경우 클라이언트가 모든 인증정보를 가지고 있기 때문에 토큰이 한번 해커에게 탈취되면 해당 토큰이 만료되기 전까지 피해를 입을 수 밖에 없다.

확장성

그럼에도 불구하고 최근 모던 웹 어플리케이션이 토큰 기반을 사용하는 이유가 바로 이 확장성 때문이다.

세션 기반 인증은 인증 정보를 서버에 저장하기 때문에, 서버의 확장성과 부하 분산에 제약이 있다. 또한 일반적으로 웹 어플리케이션의 서버 확장 방식은 수평 확장을 사용한다. 즉, 한대가 아닌 여러대의 서버가 요청을 처리하게 된는데 이때 다양한 웹에서 세션을 공유하기 위해서 추가적인 설정이 필요하다. 또한 CSRF(Cross-Site Request Forgery) 공격과 같은 보안 이슈가 발생할 수 있다.

반면, 토큰 기반 인증은 인증 정보를 클라이언트 측에서 관리하기 때문에 서버의 확장성과 부하 분산에 유리하다. 또한 토큰을 이용하여 클라이언트-서버 간 인증을 처리하기 때문에 다양한 클라이언트에서 쉽게 사용할 수 있다. 또한, CSRF 공격과 같은 보안 이슈를 방지하기 위해 CSRF 토큰을 사용할 수 있다.

또한, 토큰 기반 인증은 OAuth와 같은 인증 프레임워크와 함께 사용할 수 있어서, 클라이언트-서버 간 인증 외에도 다른 서비스 간 인증에도 사용할 수 있다.

  • CSRF 공격?

    웹 어플리케이션 취약점 중 하나로 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위 (수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격이다.

    예를 들어, 세션 기반 인증은 HTTP 요청을 보낼 때마다 session id를 함께 보낸다고 했다. 이 session id를 탈취하여, 의도한 행위를 웹 사이트에게 요청할 수 있게 된다. (EX. 페이스북에 희생자의 계정으로 광고성 글을 올리는 것 )

참고


https://hudi.blog/session-based-auth-vs-token-based-auth/

  • 내부 session vs token 도식화

    Untitled 2