본문 바로가기
TIL

로그인 회원가입의 기본 인증 / 인가 이해하기

by 박수미/ 2024. 7. 19.

1. 인증과 인가의 개념

  • 인증 - 서비스를 이용하려는 유저가 등록된 회원인지 확인하는 절차 (로그인)
  • 인가 - 인증을 받은 유저가 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차 (로그인이 된 상태의 이후 과정)

HTTP 프로토콜의 특징 2가지

  • 무상태 - 요청이 독립적이며, 서버가 이전에 한 요청을 기억하지 않습니다. 따라서 요청마다 서버에서 요구하는 상태정보를 담아서 요청해야한다.
  • 비연결성 - 클라이언트와 서버가 연결되어 있지 않습니다. 서버의 입장에서는 매번 새로운 요청입니다.

2. 쿠키, 세션, 토큰

쿠키

  • 브라우저에 저장되는 작은 데이터 조각이며, key-value 형태로 저장됩니다.
  • HTTP가 무상태성과 비연결성 특성에도 불구하고, 쿠키를 사용하면 마치 서버가 클라이언트의 인증 상태를 기억하는 것처럼 구현할 수 있습니다.
  • 서버에 특정 API 요청을 했을 때 서버가 응답 시 헤더 Set-Cookie 속성으로 쿠키정보를 담아주면, 응답을 받은 브라우저는 쿠키를 브라우저에 자동으로 저장합니다.
  • 쿠키를 클라이언트에서 직접 추가/수정/삭제할 수 있습니다.

세션을 이용한 인증 방식

  • 사용자와 서버 간의 연결성이 활성화된 상태를 의미하는 개념입니다.
  • 로그인 성공 -> 서버에서 세션 생성 및 저장(key-value 형식) -> key를 브라우저에 응답

쿠키 - 세션 인증방식

  • 로그인/회원가입 시 세션 인증
  • 로그인/회원가입 성공 시 서버에서 쿠키 sessionld를 담아서 보내줍니다.
  • 세션 유지 상태 : 서버에서 관리하는 세션 저장소에 회원 데이터가 있다.
  • 세션 만료 상태 : 서버에서 관리하는 세션 저장소에 회원 데이터가 없다.

세션 인증 방식의 한계

  • 확장성 문제 - 세션 정보는 서버의 메모리나 저장소에 저장되기 때문에, 서버가 많아질수록 세션 동기화 문제가 발생합니다. 여러 서버가 동일한 세션 정보를 공유해야 하므로, 이를 관리하기 위한 추가적인 복잡성이 필요합니다.
  • 메모리 사용량 증가 - 많은 사용자가 접속할 경우, 각 사용자의 세션 정보를 서버 메모리에 저장하는 방식은 메모리 사용량이 급증하게 됩니다. 이는 서버 성능 저하와 비용 증가를 초래할 수 있습니다.
  • 상태 유지의 복잡성 - 세션은 서버에 상태를 저장하므로 서버가 무상태로 유지되기 어렵습니다.
  • 보안 문제 - 세션 ID가 탈취된 경우, 이를 통해 사용자의 세션을 가로채는 세션 하이재킹공격이 발생할 수 있습니다.

세션 인증 방식의 이러한 한계를 극복하기 위해 등장한 것이 바로 JWT(JSON Web Token)입니다. JWT는 서버의 확장성, 무상태성 유지, 보안성 등을 개선한 토큰 기반의 인증 방식입니다.

 

토큰을 이용한 인증 방식

  • 클라이언트에서 보관하는 암호화 또는 인코딩 된 인증 정보를 의미합니다.
  • 세션처럼 서버에서 사용자의 인증 정보를 보관할 필요가 없기 때문에 서버 부담을 줄여주는 인증 수단입니다.

JWT의 개념과 특징

토큰기반 인증 방식에서 사용되는 특별한 토큰입니다. 로그인한 사용자가 이후에 서버에 요청을 보낼 때 사용합니다.

  1. 헤더 - 어떤 종류의 토큰인지와 어떤 알고리즘으로 서명되었는지에 대한 정보가 들어있습니다.
  2. 페이로드 - 실제로 중요한 데이터가 들어있는 부분입니다. ex) 사용자 ID, 토큰의 만료 시간 등
  3. 서명 - 토큰이 위조되지 않았는지 확인하는 역할을 합니다. 서버만이 알 수 있는 비밀키로 서명되어 있습니다. (무결성 보장)

 JWT - 세션 인증방식

  • 로그인/회원가입 시 토큰 인증
  • 인가 필요한 API 요청/응답

'TIL' 카테고리의 다른 글

CSR과 SSR은 무엇일까?  (1) 2024.08.29
Next.js를 사용하는 이유와 App Router와 Pages Router  (0) 2024.08.27
redux 사용법  (0) 2024.06.26
TypeScript 공부하기  (0) 2024.06.24
TanStack Query 사용법을 알아보자!  (0) 2024.06.20