1009 로그인/로그아웃

왕감자·2024년 10월 9일

KB IT's Your Life

목록 보기
177/177

🔸 로그인/로그아웃 관련 기술


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에 담긴 클레임 정보 해석 - 필요 데이터 추출
      • ex. ID, 만료 시간, 역할 정보 등
  • 유효성 검증
    • Signature, 만료 시간 확인 등
  • 유효한 토큰이라면 추출한 사용자 정보를 기반으로 Authentication 객체 생성
  • 해당 사용자 정보(Authentication)를 Security Context에 저장

Redis

  • 인메모리 DB
  • 주로 캐싱, 세션 관리, 토큰 상태 관리
  • 빠른 속도 - Access Token, Refresh Token 블랙리스트 관리
  • 휘발성



🔸 로그인 프로세스

  1. 사용자> ID / 비밀번호
  2. Spring Security>
    → UserDetailsService를 통해 사용자 정보 확인
    → 인증 성공 - JWT 발급
  3. Access Token - 클라이언트에 반환, 로컬or세션에 저장
  4. Refresh Token - 쿠키에 저장 (HTTP-Only)
  5. 클라이언트> Access Token을 요청 헤더에 포함시켜 서버에 보냄
  6. 서버> 요청 들어올 때마다 JwtAuthenticationFilter에서 JWT 확인 → 유효하면 인증 허용

🔸 로그아웃 프로세스

  1. 클라이언트> 로그아웃 요청
  2. 클라이언트 측> 토큰 삭제
  3. 서버> Access Token, Refresh Token 블랙리스트에 등록 - 설정된 만료 시간까지 보관
  4. 클라이언트> 해당 Access 요청
    서버> Redis에서 토큰이 블랙리스트에 있는지 확인
    → 블랙리스트에 있으면 요청 차단


🔸 토큰 저장

✅ Access Token

  • Local Storage
    • 브라우저가 종료되어도 데이터 유지
    • 자동 로그인이나 세션 지속 기능 구현 가능
    • 로그아웃 전까지 유효
    • 보안상 취약
  • Session Storage
    - 브라우저 탭을 닫으면 데이터 사라짐
    • 보안성 높음
    • 다중 탭 사용할 경우 탭마다 공유x

🤔 Access Token을 로컬이나 세션에 저장하는 이유?

⇨ 로컬, 세션은 브라우저에서 제공하는 클라이언트 측 저장소
⇨ 클라이언트 측에서 버서와의 통신에 필요한 토큰이므로 빠르게 접근할 수 있는 저장소(로컬, 세션)에 저장

✅ Refresh Token

  • 쿠키 (HTTP-only)
    • Refresh Token은 Access Token 보다 긴 수명을 가짐
    • 자바스크립트로 접근 불가, 오직 클라이언트 간의 HTTP 요청/응답을 통해서 사용 - XSS 공격으로부터 보호
    • 브라우저 서버에 요청을 보낼 때 자동으로 전송됨

0개의 댓글