728x90
HTTP는 클라이언트(프론트)와 서버(백엔드) 간의 통신을 가능하게 한다. HTTP는 상태를 저장하지 않기 때문에 각 요청은 이전에 수행된 작업에 대해 전혀 인지하지 못한다.
예) 구글 계정에 로그인하고 설정 페이지로 이동했다면, 기본 HTTP 동작에서는 서버가 우리가 방금 로그인했는지 할지 못해 다시 로그인해야 할 것이다. 하지만, 세션이나 토큰 인증을 사용하면 서버에 우리가 이미 로그인했음을 알리고 해당 페이지에 접근할 수 있도록 허용할 수 있다!!!
❓인증
- 사용자가 누구인지 확인하는 과정
사용자가 이메일과 비밀번호를 입력
서버는 입력된 이메일과 비밀번호가 데이터베이스에 저장된 정보와 일치하는지 확인
일치하면 사용자에게 인증 토큰이나 세션 ID를 발급하여 로그인에 성공
❓인가
- 확인된 사용자가 어떤 자원에 접근할 수 있는지 결정하는 과정
사용자가 로그인에 성공한 후, 관리자 페이지에 접근하려고 함
서버는 사용자의 역할(role)을 확인
예) 사용자가 관리자(admin)인지 확인
사용자가 관리자라면 접근을 허용하고, 그렇지 않다면 접근을 거부
✨세션 기반 인증
- 서버가 세션 데이터를 관리하여 클라이언트의 상태를 유지한다.
- 세션 데이터는 서버에 저장되고, 세션 ID는 클라이언트 측 쿠키에 저장됩니다.
- 세션 ID가 유출되면 보안 문제가 발생할 수 있지만, 서버에서 세션 데이터를 관리하므로 비교적 안전하다.
- 많은 세션 데이터를 서버가 관리해야 하므로, 서버의 부담이 커질 수 있어 확장성이 낮다.
- 사용자가 로그인하면 서버는 세션을 생성하고, 세션 ID를 클라이언트에 쿠키로 전달한다.
- 이후 클라이언트가 서버에 요청을 보낼 때마다 세션 ID를 포함시켜 보낸다.
- 서버는 세션 ID를 통해 서버에 저장된 사용자의 세션 데이터를 조회하여 인증을 처리한다.
✨토큰 기반 인증
- 서버는 상태를 저장하지 않으며, 클라이언트가 토큰을 통해 인증을 관리한다.
- 토큰은 클라이언트 측 (주로 로컬 스토리지나 세션 스토리지)에 저장된다.
- 토큰이 클라이언트에 저장되므로 유출 시 보안 문제가 발생할 수 있다. 하지만 토큰에는 만료 시간이 설정되어 있어 이러한 문제를 완화할 수 있다.
- 서버가 상태를 저장하지 않으므로, 서버 부담이 적고 확장성이 높다.
- 사용자가 로그인하면 서버는 JWT(JSON Web Token) 같은 토큰을 생성하여 클라이언트에 전달한다.
- 클라이언트는 요청을 보낼 때 이 토큰을 포함시켜 보낸다.
- 서버는 토큰을 검증하여 사용자 인증을 처리한다.
❓JWT(JSON Web Token)
모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰
JWT는 주로 로컬 스토리지에 저장되며, 이후 요청마다 헤더에 포함되어 전송된다.
서버는 JWT를 수신하고 검증한 후 클라이언트에 응답을 보다.
headers:{ "Authorization": "Bearer ${JWT_TOKEN}" }
🤔언제 사용해야 할까
인증 방법에 있어 선호되는 방식은 없으며, 두 방법을 번갈아 사용하거나 함께 사용할 수 있다. 하지만, 토큰 기반 인증은 토큰이 클라이언트 측에 저장되기 때문에 세션 기반 인증보다 더 잘 확장된다는 점에 주목하자. 세션 기반 인증은 서버 메모리를 사용하므로 동시에 많은 사용자가 시스템을 사용할 때 문제가 될 수 있다.
✨세션 기반 인증 vs. 토큰 기반 인증
세션 기반 인증 | 토큰 기반 인증 | |
상태 관리 | 서버에서 상태를 유지 | 클라이언트에서 상태를 관리 |
저장 위치 | 서버에 세션 데이터 저장, 클라이언트는 세션 ID를 쿠키에 저장 | 클라이언트에 토큰 저장 (주로 로컬 스토리지나 세션 스토리지) |
인증 방식 | 서버에서 세션 ID를 통해 인증 | 서버에서 토큰을 검증하여 인증 |
보안 | 세션 ID가 유출되면 보안 문제 발생 가능, 서버에서 관리하므로 비교적 안전 | 토큰이 유출되면 보안 문제 발생 가능, 만료 시간을 설정하여 완화 |
확장성 | 서버의 메모리나 저장소에 부담이 커질 수 있어 확장성 낮음 | 서버 부담이 적어 확장성 높음 |
유효 기간 | 일반적으로 브라우저가 닫힐 때까지 또는 서버에서 설정한 시간까지 | 토큰에 만료 시간이 포함되어 있음 |
서버 간 세션 공유 | 필요할 수 있음 | 필요 없음 |
장점 | 서버 측에서 상태를 관리하므로 클라이언트가 신경 쓸 부분이 적음 | 서버 부담이 적고 확장성이 높음 |
단점 | 서버의 메모리나 저장소에 부담이 커질 수 있음 | 토큰 유출 시 보안 문제 발생 가능 |
'🔥CS 뽀개기' 카테고리의 다른 글
구글 소셜 로그인 처리하기 (feat. OAuth 2.0) (0) | 2024.06.18 |
---|---|
개발자가 SEO(검색 엔진 최적화)를 신경써야 하는 이유 (1) | 2024.06.03 |
렌더링 사형제 CSR, SSR, SSG, ISR (2) | 2024.05.28 |
웹페이지가 렌더링되는 과정 (0) | 2024.05.23 |
브라우저 주소창에 www.google.com을 입력하면 어떤 일이 일어날까? (1) | 2024.05.23 |