본문 바로가기
🔥CS 뽀개기

세션 기반 인증 vs. 토큰 기반 인증 (feat. 인증+인가)

by 짱돌보리 2024. 6. 12.
728x90

HTTP는 클라이언트(프론트)와 서버(백엔드) 간의 통신을 가능하게 한다. HTTP는 상태를 저장하지 않기 때문에 각 요청은 이전에 수행된 작업에 대해 전혀 인지하지 못한다.
예) 구글 계정에 로그인하고 설정 페이지로 이동했다면, 기본 HTTP 동작에서는 서버가 우리가 방금 로그인했는지 할지 못해 다시 로그인해야 할 것이다. 하지만, 세션이나 토큰 인증을 사용하면 서버에 우리가 이미 로그인했음을 알리고 해당 페이지에 접근할 수 있도록 허용할 수 있다!!!

❓인증

  • 사용자가 누구인지 확인하는 과정
사용자가 이메일과 비밀번호를 입력
서버는 입력된 이메일과 비밀번호가 데이터베이스에 저장된 정보와 일치하는지 확인
일치하면 사용자에게 인증 토큰이나 세션 ID를 발급하여 로그인에 성공

❓인가

  • 확인된 사용자가 어떤 자원에 접근할 수 있는지 결정하는 과정
사용자가 로그인에 성공한 후, 관리자 페이지에 접근하려고 함
서버는 사용자의 역할(role)을 확인

예) 사용자가 관리자(admin)인지 확인
사용자가 관리자라면 접근을 허용하고, 그렇지 않다면 접근을 거부

✨세션 기반 인증

  • 서버가 세션 데이터를 관리하여 클라이언트의 상태를 유지한다.
  • 세션 데이터는 서버에 저장되고, 세션 ID는 클라이언트 측 쿠키에 저장됩니다.
  • 세션 ID가 유출되면 보안 문제가 발생할 수 있지만, 서버에서 세션 데이터를 관리하므로 비교적 안전하다.
  • 많은 세션 데이터를 서버가 관리해야 하므로, 서버의 부담이 커질 수 있어 확장성이 낮다.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F78D4B5D1C8B8054

  1. 사용자가 로그인하면 서버는 세션을 생성하고, 세션 ID를 클라이언트에 쿠키로 전달한다.
  2. 이후 클라이언트가 서버에 요청을 보낼 때마다 세션 ID를 포함시켜 보낸다.
  3. 서버는 세션 ID를 통해 서버에 저장된 사용자의 세션 데이터를 조회하여 인증을 처리한다.

 

✨토큰 기반 인증

  • 서버는 상태를 저장하지 않으며, 클라이언트가 토큰을 통해 인증을 관리한다.
  • 토큰은 클라이언트 측 (주로 로컬 스토리지나 세션 스토리지)에 저장된다.
  • 토큰이 클라이언트에 저장되므로 유출 시 보안 문제가 발생할 수 있다. 하지만 토큰에는 만료 시간이 설정되어 있어 이러한 문제를 완화할 수 있다.
  • 서버가 상태를 저장하지 않으므로, 서버 부담이 적고 확장성이 높다.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D372385D1C8B8125

 

  1. 사용자가 로그인하면 서버는 JWT(JSON Web Token) 같은 토큰을 생성하여 클라이언트에 전달한다.
  2. 클라이언트는 요청을 보낼 때 이 토큰을 포함시켜 보낸다.
  3. 서버는 토큰을 검증하여 사용자 인증을 처리한다.
JWT(JSON Web Token) 
모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰

JWT는 주로 로컬 스토리지에 저장되며, 이후 요청마다 헤더에 포함되어 전송된다.
서버는 JWT를 수신하고 검증한 후 클라이언트에 응답을 보다.
headers:{
"Authorization": "Bearer ${JWT_TOKEN}"
}​

🤔언제 사용해야 할까

인증 방법에 있어 선호되는 방식은 없으며, 두 방법을 번갈아 사용하거나 함께 사용할 수 있다. 하지만, 토큰 기반 인증은 토큰이 클라이언트 측에 저장되기 때문에 세션 기반 인증보다 더 잘 확장된다는 점에 주목하자. 세션 기반 인증은 서버 메모리를 사용하므로 동시에 많은 사용자가 시스템을 사용할 때 문제가 될 수 있다.

✨세션 기반 인증 vs. 토큰 기반 인증

  세션 기반 인증 토큰 기반 인증
상태 관리 서버에서 상태를 유지 클라이언트에서 상태를 관리
저장 위치 서버에 세션 데이터 저장, 클라이언트는 세션 ID를 쿠키에 저장 클라이언트에 토큰 저장 (주로 로컬 스토리지나 세션 스토리지)
인증 방식 서버에서 세션 ID를 통해 인증 서버에서 토큰을 검증하여 인증
보안 세션 ID가 유출되면 보안 문제 발생 가능, 서버에서 관리하므로 비교적 안전 토큰이 유출되면 보안 문제 발생 가능, 만료 시간을 설정하여 완화
확장성 서버의 메모리나 저장소에 부담이 커질 수 있어 확장성 낮음 서버 부담이 적어 확장성 높음
유효 기간 일반적으로 브라우저가 닫힐 때까지 또는 서버에서 설정한 시간까지 토큰에 만료 시간이 포함되어 있음
서버 간 세션 공유 필요할 수 있음 필요 없음
장점 서버 측에서 상태를 관리하므로 클라이언트가 신경 쓸 부분이 적음 서버 부담이 적고 확장성이 높음
단점 서버의 메모리나 저장소에 부담이 커질 수 있음 토큰 유출 시 보안 문제 발생 가능