🔸 로그인/로그아웃 관련 기술
JWT (Json Web Token)
: 클라이언트와 서버 간 인증・정보 교환을 위한 토큰 기반 인증 방식
✅ 토큰 구성
1) Header : 토큰 타입, 해싱 알고리즘 정보
2) Payload : 인증된 사용자 정보 (ex. ID, 토큰 만료시간..)
3) Signature : [헤더+페이로드 인코딩 → 비밀키] ▶︎ 데이터 무결성 보장
✅ 토큰 종류
- Access Token : 짧은 시간 유효, 사용자 요청 인증 시 사용
- Refresh Token : Access Token이 만료됐을 때 새로운 Access Token을 발급받기 위해 사용
✅ 사용
- 로그인 성공
- 서버: Token 생성 - 클라이언트에 제공
- 클라이언트가 서버로 요청 보낼 때 토큰을 포함시켜 자신을 인증
Spring Security
: Java Spring Framework
: 인증과 권한 부여 처리
✅ 기능
- 인증 (Authentication) : 사용자가 누구인지 확인 (로그인)
- 권한 부여 (Authorization) : 사용자가 어떤 자원에 접근할 수 있는지 확인
✅ 사용
- 사용자 JWT 보냄
- Spring Security 필터 체인 (ex. JwtAuthenticationFilter)을 통해 JWT를 파싱
- Header, Payload, Signature 구분
- Payload에 담긴 클레임 정보 해석 - 필요 데이터 추출
- 유효성 검증
- 유효한 토큰이라면 추출한 사용자 정보를 기반으로 Authentication 객체 생성
- 해당 사용자 정보(Authentication)를 Security Context에 저장
Redis
- 인메모리 DB
- 주로 캐싱, 세션 관리, 토큰 상태 관리
- 빠른 속도 - Access Token, Refresh Token 블랙리스트 관리
- 휘발성
🔸 로그인 프로세스
- 사용자> ID / 비밀번호
- Spring Security>
→ UserDetailsService를 통해 사용자 정보 확인
→ 인증 성공 - JWT 발급
- Access Token - 클라이언트에 반환, 로컬or세션에 저장
- Refresh Token - 쿠키에 저장 (HTTP-Only)
- 클라이언트> Access Token을 요청 헤더에 포함시켜 서버에 보냄
- 서버> 요청 들어올 때마다 JwtAuthenticationFilter에서 JWT 확인 → 유효하면 인증 허용
🔸 로그아웃 프로세스
- 클라이언트> 로그아웃 요청
- 클라이언트 측> 토큰 삭제
- 서버> Access Token, Refresh Token 블랙리스트에 등록 - 설정된 만료 시간까지 보관
- 클라이언트> 해당 Access 요청
→ 서버> Redis에서 토큰이 블랙리스트에 있는지 확인
→ 블랙리스트에 있으면 요청 차단
🔸 토큰 저장
✅ Access Token
- Local Storage
- 브라우저가 종료되어도 데이터 유지
- 자동 로그인이나 세션 지속 기능 구현 가능
- 로그아웃 전까지 유효
- 보안상 취약
- Session Storage
- 브라우저 탭을 닫으면 데이터 사라짐
- 보안성 높음
- 다중 탭 사용할 경우 탭마다 공유x
🤔 Access Token을 로컬이나 세션에 저장하는 이유?
⇨ 로컬, 세션은 브라우저에서 제공하는 클라이언트 측 저장소
⇨ 클라이언트 측에서 버서와의 통신에 필요한 토큰이므로 빠르게 접근할 수 있는 저장소(로컬, 세션)에 저장
✅ Refresh Token
- 쿠키 (HTTP-only)
- Refresh Token은 Access Token 보다 긴 수명을 가짐
- 자바스크립트로 접근 불가, 오직 클라이언트 간의 HTTP 요청/응답을 통해서 사용 - XSS 공격으로부터 보호
- 브라우저 서버에 요청을 보낼 때 자동으로 전송됨