본문 바로가기

Web | Network

Web - 세션 기반 인증과 토큰 기반 인증 (Session and Token Authentication)

https://lgphone.tistory.com/65

 

Web - 쿠키와 세션 (Cookie and Session)

클라이언트에서 보내는 요청에는 큰 단점이 존재한다. 바로 누가 요청을 보내는지 모른다는 것이다. 물론 요청을 보내는 IP 주소나 브라우저의 정보를 받아올 수는 있다. 그러나 여러 컴퓨터가 �

lgphone.tistory.com

 

세션에 대한 내용은 위 글을 참고한다.

 

인증 방식으로는 크게 두 가지가 최근 웹 개발 트렌드에서 많이 쓰인다. 바로 세션 기반 인증과 토큰 기반 인증이다. 두 가지의 차이점과 어떤 상황에서 어떤 인증 방식을 사용하는 것이 좋을지 한번 다뤄보자.

 

세션 기반 인증

세션 기반 인증은 쿠키를 사용한다. 인증 절차는 다음과 같다.

  1. 유저가 로그인을 하면 세션이 서버 메모리에 저장된다. 이 때, 세션을 식별하기 위한 session id가 주어지며, 이를 기준으로 정보를 저장한다.
  2. 브라우저는 쿠키로 session id를 저장한다.
  3. 쿠키에 정보가 담겨있기 때문에 브라우저는 해당 사이트에 대한 모든 request에 session id를 쿠키에 담아 전송한다.
  4. 서버는 클라이언트가 보낸 session id와 서버 메모리로 관리하고 있는 session id를 비교하여 verification을 수행한다.

장점

  • 구현이 명확하며, 실제 서버에서 로그인 상태 확인이 굉장히 유용하다.
  • 상대적으로 안전한 편이다. 서버측에서 데이터를 관리하기 때문에 클라이언트 변조에 영향받거나 데이터 손상 우려가 없다.

단점

  • 서버 메모리에 세션 정보를 저장하기 때문에 이용자가 많을 경우 서버에 부담이 될 수 있다.
  • 서버 메모리에 세션 정보가 저장되기 때문에 Scale Out/ In이 부담이 될 수 있으며, 결국 유저 상태에 무관하게 동작할 수 있도록 Data-Driven 아키텍쳐가 요구된다.
  • 멀티 디바이스 환경에서 로그인 시 신경써줘야할 부분들이 생긴다.

 

토큰 기반 인증

토큰 기반 인증의 방법으로 많은 웹서버들은 JSON Web Token을 사용한다. 토큰 기반 인증 방식은 유저의 정보가 서버에 저장되지 않는다. 인증절차는 다음과 같다.

  1. 유저는 로그인을 하면 서버에서 토큰을 발급받는다.
  2. 클라이언트 (유저) 는 발급된 토큰을 저장한다 (local storage).
  3. 클라이언트는 요청 시 저장된 토큰을 헤더에 포함시켜 보낸다.
  4. 서버는 매 요청시 클라이언트로부터 전달받은 헤더의 토큰 정보를 verification 한 뒤, 해당 유저에 권한을 인가한다.

장점

  • 클라이언트에 저장되기 때문에 서버의 메모리에 부담이 되지 않으며, Scale에 있어 대비책을 고려할 필요가 없다.
  • 멀티 디바이스 환경에 대한 부담이 없다.

단점

  • 상대적으로 손상의 위험이 크다.
  • 구현을 하다보면 서버측에 token blacklist를 관리하게 될 가능성이 있고, 그렇다면 서버측 메모리의 소모가 발생한다.
  • 토큰은 일반적으로 session id보다 길다.
  • XSS 공격에 취약할 수 있어 민감한 정보는 포함시키지 않을 필요가 있다.

 

토큰 기반 인증 때 쓰이는 JWT (JSON Web Token) 에 대한 학습은 다음 사이트에서 할 수 있다.

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

토큰 기반 인증에 대해 더 자세히 알고 싶다면 다음 포스트를 참고한다.

https://yonghyunlee.gitlab.io/node/jwt/

 

세션 기반 인증 방식과 토큰 기반 인증(JWT) - 김땡땡's blog

세션 기반 인증 방식 옛날에 토큰 기반 인증이 없었을 때 서버 세션을 사용해 인증을 했다. 클라이언트가 로그인 성공하면 서버가 유저 세션을 만들고 메모리나 데이터베이스에 저장한다. 서버�

yonghyunlee.gitlab.io

 

출처

https://jins-dev.tistory.com/entry/Session-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EA%B3%BC-Token-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D

https://yonghyunlee.gitlab.io/node/jwt/

https://jwt.io/

'Web | Network' 카테고리의 다른 글

Web - DNS (Domain Name Server)  (0) 2022.03.19
Web - API  (0) 2020.08.16
Web - IP, 포트, 그리고 로컬호스트 (IP, Port, and Localhost)  (2) 2020.08.12
Web - REST  (0) 2020.08.08
Web - HTTP 상태 코드 (HTTP Status Code)  (0) 2020.08.08