Skip to content

인증(Authentication)과 인가(Authorization)

인증과 인가

인증과 인가는 종종 혼동되지만 엄밀히 다른 개념이다.

인증 (Authentication)

- 사용자가 주장하는 신원이 실제로 그 사용자임을 확인하는 과정
- ex: 로그인

인가 (Authorization)

- 인증된 사용자가 특정 리소스에 접근할 권한이 있는지 확인하는 과정
- ex: user1은 자신이 쓴 글을 수정할 수 있지만, user2가 쓴 글을 수정할 수 없음 / 관리자 페이지 접근 권한이 없음

HTTP의 비상태성(Stateless)

  • HTTP는 기본적으로 상태를 저장하지 않는 비상태성 프로토콜
  • 서버는 이전 요청의 맥락을 기억하지 않는다.
  • 매 작업마다 사용자에게 로그인을 요청할 수 는 없으므로 로그인 상태 등 연속된 상태를 유지하려면 별도의 메커니즘이 필요하다.
  • 일반적인 해결책: 주로 인가 문제를 해결하는 세션(Session) 또는 토큰(Token)을 사용한다

세션기반 인증 (Session-based Authentication)

동작 흐름

  1. 사용자가 로그인하면 서버는 인증 정보를 세션 저장소에 저장한다.
  2. 서버는 세션을 식별할 수 있는 Session ID를 발급하고, 브라우저의 쿠키에 저장한다.
  3. 이후 요청마다 브라우저는 쿠키에 담긴 Session ID를 전송한다.
  4. 서버는 Session ID로 세션 저장소를 조회하여 사용자를 인증/인가한다.

특징 및 장단점

  • 서버 측 상태 관리: 모든 인증 정보는 서버에 저장됨.
  • 보안: 서버에서 세션을 무효화(로그아웃, 강제 만료)할 수 있어 탈취 대응이 비교적 쉬움.
  • 트래픽: 쿠키에 세션 ID만 전송하므로 네트워크 오버헤드가 작음.
  • 확장성 문제: 다중 서버 환경에서는 세션 불일치 문제가 발생할 수 있음(해결책: Sticky Session, Session Clustering, 외부 세션 저장소 등).
  • 서버 부담: 세션 데이터가 많아지면 서버 메모리/저장소 부담 증가.

토큰기반 인증 (Token-based Authentication, JWT 기준)

동작 흐름

  1. 사용자가 로그인하면 서버는 사용자 정보를 포함한 토큰(JWT)을 발급한다.
  2. 클라이언트는 토큰을 (LocalStorage 또는 쿠키 등) 저장하고, 이후 요청 시 Authorization 헤더에 토큰을 담아 보낸다.
  3. 서버는 토큰의 서명·유효기간 등을 검증한 뒤 토큰에 담긴 정보를 바탕으로 인가를 수행한다.

특징 및 장단점

  • 무상태(Stateless): 서버가 인증 상태를 저장하지 않으므로 수평 확장에 유리.
  • 확장성: 마이크로서비스나 글로벌 서비스에서 장점이 큼.
  • 서버 부담: 인증 데이터를 클라이언트가 들고 있으므로 서버 부담이 적음.
  • 보안 문제: 토큰이 탈취되면 만료 시점까지 악용될 수 있음(블랙리스트/리프레시 토큰 전략 필요).
  • 토큰 크기: JWT는 클레임들이 포함되어 있어 세션 ID보다 크기가 크다 -> 네트워크 트래픽 증가.
  • 민감 정보 제한: JWT Payload는 암호화되지 않으므로 민감한 정보를 담아서는 안 됨.

세션 기반 vs 토큰 기반

항목세션 기반토큰 기반 (JWT)
저장 위치서버 (세션 저장소 / 메모리)클라이언트 (LocalStorage / Cookie)
네트워크 트래픽적음 (세션 ID만 전송)많음 (JWT 크기 큼)
보안성세션 무효화 가능 → 상대적 이점탈취 시 위험, 무효화 복잡 (블랙리스트 필요)
확장성세션 동기화 필요Stateless 활용 가능, 확장성 높음
서버 부담세션 증가 시 서버 부담 증가클라이언트가 인증 데이터 보관하므로 서버 부담 적음
민감 데이터저장 가능 (서버에서 관리)불가 (혹은 제한적)
인증은 사용자가 누구인지 검증하는 과정(로그인), 인가는 인증된 사용자가 특정 리소스에 접근할 수 있는지 확인하는 과정이다. HTTP는 비상태성이므로 세션 또는 토큰을 사용해 상태를 유지한다.
세션 기반은 서버에서 세션을 관리해 보안적 장점이 있으나 확장성에 제약이 있고, 토큰 기반(JWT)은 Stateless로 확장성이 뛰어나지만 토큰 탈취 시 위험과 토큰 크기 문제를 고려해야 한다.