[Spring] 스프링 숙련 공부2 !

석연걸·2025년 2월 6일

스파르타 코딩클럽

목록 보기
15/17
post-thumbnail

Cookie

  • 사용자의 웹 브라우저에 저장되는 정보로 사용자의 상태 혹은 세션을 유지하거나, 경험을 개선하기 위해 사용된다.

  • Set-Cookie (로그인 성공 시 응답)
    • 로그인 시 전달된 ID, Password로 User 테이블을 조회해 일치 여부 확인
    • 일치하면 Set-Cookie를 활용해 Cookie에 사용할 값 저장

  • Cookie (로그인 이후 요청)
    • 로그인 이후에는 모든 요청마다 Request Header에 Cookie 값을 담아서 요청
    • Cookie에 담겨있는 값으로 인증/인가 진행

  • Cookie의 문제점
    • 쿠키 값은 임의로 변경할 수 있다. (Cookie는 Client쪽에 저장돼있음)
      • Client가 임의로 쿠키의 값을 변경하면 서버는 다른 유저로 인식
    • Cookie에 저장된 Data는 탈취되기 쉽다.
    • 즉, Cookie는 보안에 취약함

Session

  • 서버에서 중요한 정보를 저장하며, 로그인 연결을 유지시키는 방법

  • Session 생성 순서 (로그인)
    • 로그인에 성공하면 서버에서 임의로 만든 Session Id를 Set-Cookie 한다.
    • User의 중요한 정보들을 서버의 Session 저장소에 저장한다.
    • Session을 사용하면 유저의 관련된 정보는 클라이언트에 없다.

  • 로그인 이후 요청
    • 클라이언트는 모든 요청에 Cookie에 있는 Session Id를 전달
    • 서버는 전달받은 Session Id를 통해 저장소를 조회
    • 로그인시 저장했던 Session 정보를 서버에서 사용

(HttpServletRequest) request.getSession()

  • Default는 true
  • Request 객체 내 Session이 존재한다면 기존 Session을 반환
  • 없다면 새로운 Session을 생성해서 반환
    • false 이면 Session이 없을 시 null을 반환

(HttpSession) session.setAttribute(Const.LOGIN_USER, responseDto)

  • 하나의 세션에 여러개의 데이터를 메모리에 저장
  • session.getAttribute(Const.LOGIN_USER)로 반환 받을 때 반환 타입은 Object이다.

Token (인증 / 인가)

  • 서버가 아닌 클라이언트에 저장되어 부담을 덜 수 있다.
  • Token은 Stateless를 기반으로 해 확장성이 뛰어나다.
  • 인증된 사용자임을 확인하기 위한 고유한 서명을 포함해 위조된 요청인지 확인할 수 있다.

  • 동작 순서
    • 사용자의 고유한 정보를 포함한다.
    • DB에 접근하지 않고 Token의 유효성만 검증한다.

JWT (JSON Web Token)

  • 인증에 필요한 정보들을 암호화시킨 JSON 형태의 Token

  • JWT 인증 과정
    • 클라이언트의 로그인 요청
    • 로그인에 성공했다면, Header, Payload에 Secret Key를 사용하여 Signature을 만든다.
      • 이후 Base64를 사용해 인코딩
      • Cookie에 담아 클라이언트에게 JWT를 발급
  • 발급받은 JWT를 저장 후 서버에 요청할 때 Authorization Header에 JWT를 담아 보냄
  • 서버에서 JWT 유효성 검사 후, 통과했다면 인증에 성공해 요청을 처리

  • JWT 유효성 검사
    1. B가 A의 JWT를 탈취
    2. B가 탈취한 JWT의 Payload를 임의로 수정
    3. B가 수정한 JWT로 서버에 요청
    4. 서버는 Signature을 사용하여 유효성 검사 (Signature 불일치)
      • Header + Payload를 서버의 Secret Key 값을 이용해 Signature을 다시 만들어 비교
      • 임의로 조작된 데이터를 판별

  • JWT의 목적은 정보 보호가 아닌 위조 방지에 있다.

Access Token / Refresh Token

  • Token은 쿠키와 같이 클라이언트에서 보관하여 탈취당할 위험이 크기 때문에, 만료 시간을 설정해줘야 한다.

  • Access Token
    • 사용자 인증 후 서버가 발급하는 유저 정보가 담긴 Token
    • 유효 시간 동안 API나 리소스에 접근할 때 사용

  • Refresh Token
    • Access Token은 보안을 위해 짧은 수명을 가진다.
    • Access Token이 만료된 경우 재발급을 받기 위해 사용

  • 인증 순서

Servlet Filter

  • 보안, 로깅, 인코딩, 인증/인가 등 다양한 작업을 처리하기 위해 사용된다.

  • 특징
    1. 공통 관심사 로직 처리
      • 공통된 로직을 중앙 집중적으로 처리해 재사용성이 높고, 유지보수가 쉽다.
      • 모든 요청이 하나의 입구를 통해 처리돼 일관성을 유지한다.
    2. HTTP 요청 및 응답 필터링
    3. Filter Chain
      • 여러 개의 필터가 순차적으로 적용될 수 있다.
      • filterChain.doFilter(request, response);
        • 다음 필터로 제어를 전달한다.
    4. ★ doFilter()
      • 실제 필터링하는 주요 메서드로 필터가 처리할 작업을 정의
      • 다음 필터로 제어를 넘길지 여부를 결정

0개의 댓글