💡 둘의 개념이 헷갈리는 이유: 로그인의 경우 인증과 인가가 동시에 일어나기 때문입니다.
- 비밀번호 입력 → 인증
- 회원/비회원 권한 부여 → 인가
"비연결성 + 무상태" 환경에서 어떻게 "사용자가 로그인되었다"는 상태를 유지할까?
[클라이언트] [서버] [세션 저장소]
| | |
|-- 1. 로그인 요청 ---------->| |
| |-- 2. DB 유저 정보 확인 ---->|
| | |
| |<-- 3. 세션 생성 ------------|
| | (Session ID 발급) |
|<-- 4. Session ID 응답 ------| |
| (Set-Cookie 헤더) | |
| | |
[쿠키에 Session ID 저장] | |
| | |
|-- 5. 요청 + Session ID ---->| |
| (Cookie 헤더) |-- 6. Session ID 검증 ------>|
| |<-- 7. 유저 정보 반환 -------|
|<-- 8. 인증된 응답 ----------| |
[클라이언트] [서버]
| |
|-- 1. 로그인 요청 ---------->|
| |-- 2. DB 유저 정보 확인
| |
| |-- 3. JWT 토큰 생성
| | (유저 정보를 암호화)
|<-- 4. JWT 토큰 응답 --------|
| |
[로컬 스토리지/쿠키에 JWT 저장] |
| |
|-- 5. 요청 + JWT 토큰 ------>|
| (Authorization 헤더) |-- 6. JWT 검증 (서명 확인)
| |-- 7. 토큰에서 유저 정보 추출
|<-- 8. 인증된 응답 ----------|
| 구분 | 쿠키-세션 | JWT |
|---|---|---|
| 상태 관리 | 서버(Stateful) | 클라이언트(Stateless) |
| 저장소 | 세션 저장소 필요 | 불필요 |
| 확장성 | 제한적 | 우수 |
| 보안 | 서버에서 관리 용이 | 토큰 탈취 시 위험 |
| 성능 | 세션 DB 저장소 조회 필요 | 토큰 검증만 수행 |
| 로그아웃 | 세션 삭제로 즉시 가능 | 토큰 만료까지 유효 |
인증과 인가는 웹 애플리케이션 보안의 핵심입니다. HTTP의 비연결성과 무상태 특성을 이해하고, 각 인증 방식의 장단점을 파악하여 프로젝트 요구사항에 맞는 방식을 선택하는 것이 좋습니다.