출처 https://www.codespot.org/token-vs-session-authentication/
먼저 핵심 키워드인 인증, 인가에 대해서 알아보고 간단한 HTTP 프로토콜의 특징도 알아보겠습니다.
먼저 인증과 인가가 무엇인지 부터 알아야할 필요가 있습니다. 인증과 인가를 같거나 비슷한 개념이라고 생각하는 사람들이 많을텐데, 엄밀하게는 서로 다른 개념입니다. 인증과 인가는 요약하자면 시스템의 자원을 적절하고 유효한 사용자에게 전달하고 공개하는 방법입니다.
인증은 쉽게 말하자면, 로그인 입니다. 클라이언트
가 자기자신이라고 주장하고 있는 사용자가 맞는지를 검증하는 과정이다. 예를 들어 로그인 화면에서 내가 유저 아이디를 USER1
로 입력하고 패스워드를 입력해 제출하면, 서버에서는 내가 진짜로 USER1
이라는 유저가 맞는지 확인한다.
인가는 인증 작업 이후에 행해지는 작업으로, 인증된 사용자에 대한 자원에 대한 접근 확인 절차를 의미한다.
여기에 일반 유저인 USER1
과 USER2
가 있다. 일반 유저인 USER1
은 글 작성, 조회, 수정, 삭제 등 일반적인 작업에 대한 권한이 부여되어 있다. 하지만 USER1
은 USER2
가 작성한 글을 수정하거나 제거할 수는 없다. 타인의 리소스에 대해서는 인가
되어 있지 않기 때문이다. 또한 USER1
과 USER2
는 모두 관리자 페이지에 접속할 수 없다. 일반 유저는 관리자 페이지에 대해 인가되어 있지 않기 때문이다.
HTTP는 비상태성이라는 특성을 갖습니다. 즉 서버는 클라이언트의 상태를 저장하지 않으며, 따라서 이전 요청과 다음 요청의 맥락이 이어지지 않는다.
예를들어 🐶
종업원kim
에게 스테이크를 주문하다가 종업원kim
이 다른 사람에게 불려 간다면 다른 종업원인lee
가 올텐데 이떄 인수인계를 해주지 않기 때문에 클라이언트가 이전에 어떤 주문을 했는지 알 수 없습니다.
이와 같이 HTTP는 바로 직전에 발생한 통신을 기억하지 못합니다. 따라서 HTTP 단독으로는 요청한 클라이언트가 이전에 이미 인증과정을 거쳤는지 알 방법이 없습니다.
세션기반 인가는 사용자의 인증 정보가 서버의 세션 저장소에 저장되는 방식입니다.
- 클라이언트가 로그인 페이지에서 서버에게 사용자 이름과 비밀번호를 제출합니다.
- 서버는 제출된 정보를 확인하고, 유효한 로그인인 경우
세션 ID
을 생성합니다. 세션은 일반적으로 서버 측에서 관리되는 고유한 식별자입니다.- 서버는
세션 ID
를 클라이언트에게 전송합니다. 이세션 ID
는 보통쿠키(cookie)
를 통해 클라이언트에 저장됩니다. 이때 실제 인증 정보는 서버에 저장되어 있습니다.- 클라이언트는 이후 요청 시 쿠키를 함께 전송하여 세션 ID를 서버에 전달합니다.
- 서버는 클라이언트가 제공한
세션 ID
를 사용하여 로그인 상태를 확인하고, 필요한 정보에 접근할 수 있습니다.- 세션 방식은 서버 측에서 상태를 관리하기 때문에 비교적 간단하게 구현할 수 있습니다.
- 하지만 분산 환경에서는 서버 간의 상태 공유가 어렵고, 사용자마다 session을 저장해야 하기 때문에 많은 접속자가 생길수록 서버에 대한 부하가 발생할 수 있습니다.
토큰 기반 인증은 인증 정보를 클라이언트가 직접 들고 있는 방입니다.
- 클라이언트가 로그인 페이지에서 서버로 사용자 이름과 비밀번호를 제출합니다.
- 서버는 제출된 정보를 확인하고, 유효한 로그인인 경우에는 클라이언트에게
액세스 토큰
(access token)을 발급합니다.- 클라이언트는 발급된 액세스 토큰을 브라우저의 로컬 스토리지(혹은 쿠키)에 저장합니다.
- 이후 요청 시에는
Authorization
헤더에 액세스 토큰을 포함시켜 서버에 전달합니다.- 대표적인 토큰인
JWT
의 경우 디지털 서명이 존재해 토큰의 내용이 위변조 되었는지 서버측에서 확인할 수 있습니다.- 서버는 클라이언트가 제공한
액세스 토큰
이 위변조 되었거나, 만료 시각이 지나지 않은지 확인한 이후 확인하여 로그인 상태를 확인하고, 필요한 정보에 접근할 수 있습니다.
- 토큰 방식은 세션 방식과 달리 서버의 상태를 저장하지 않고, 클라이언트 측에서 모든 정보를 관리합니다. 이는 서버 간의 상태 공유가 필요 없으며, 분산 환경에서도 유용합니다. 또한, 토큰은 유효 기간을 설정하여 일정 시간이 지나면 자동으로 만료되도록 구성하기 때문에 서버에 부담이 덜합니다.
각 방식은 사용 사례와 보안 요구 사항에 따라 선택됩니다.
쿠키 또는 로컬 스토리지와 같은 클라이언트 저장소를 사용하여 토큰을 안전하게 저장해야 합니다. 또한, 토큰은 보안을 위해 암호화되어야 하며, HTTPS와 같은 안전한 통신 채널을 사용하는 것이 좋습니다.
참고 블로그
https://hudi.blog/session-based-auth-vs-token-based-auth/