• 토큰 기본 개념
    • 토큰 기반 인증 시스템의 구현체인 JWT(JSON Web Tokens)가 웹 표준으로 등록되어 있어, jwt 토큰방식이라 불림
  • 토큰 생성
    • 로그인 시도시 토큰 방식에서는 서버는 사용자에게 인증 토큰을 생성하여 제공

      • 클라이언트 측에서 전달받은 토큰을 localstorage에 저장

      Untitled

    • 토큰의 구성

      • JWT는 헤더, 페이로드, 서명 세 가지 주요 구성요소로 구성
        • 기본구성
          • 헤더.페이로드(본문).서명,
          • 여기서인코딩된 헤더, 인코딩된 페이로드, 서명
          • JWT 토큰은 '.'으로 구분된 세 부분(header, payload, signature)으로 이루어져 있으므로 각각 분리 가능
          • URL과 파일네임에 안전하게 사용될 수 있도록 디자인된 인코딩 방식인 Base64-URL을 사용
        • 헤더
          • 토큰의 타입(보통 JWT)과 사용된 서명 알고리즘(예: HMAC SHA256, RSA)을 지정
        • 페이로드 (Payload)
          • 페이로드는 토큰에 담을 클레임(claim)을 포함. 클레임은 토큰 사용자에 대한 속성이나 추가 데이터를 의미
          • 등록된 클레임
            • 사전 정의된 클레임 집합
            • iat(발행시간), exp(만료 시간), sub(이메일, id 등), role(권한) 등
        • 서명부(SIGNATURE)
          • 헤더, 페이로드, secret키를 서명알고리즘을 통해 암호화한 값
  • 토큰을 통한 검증 절차
    • 사용자는 api요청시에 header에 token을 넣어 서버에 api요청
      • 서버에서는 토큰을 별도로 저장하고 있지 않으므로, 요청시마다 해당 요청의 유효성 검증
      • 서버가 토큰을 저장하는 방식이 아닌, 토큰의 signature와 서버측 secret key로 다시 암호화한 것과 비교하여 검증
      • 검증과 동시에 사용자 인증정보(email, role등)을 서버에 저장하기 위해 관련 정보를 Authentication객체에 저장
        • 이는 세션에 담는 반영구적인 저장이 아닌 요청마다의 일시적인 저장
  • 토큰방식의 장점
    • 토큰을 사용한다면 서버측의 메모리 공간 절약
    • 또한, 어떤 서버로 요청이 들어가던, 상관이 없으므로, 서버의 scalability가 높아짐
      • 로드밸런싱, msa아키텍처상에서 강력한 장점을 가지고 있음
  • 토큰방식의 단점
    • 토큰이 유출되어도, 서버측에서 토큰을 폐기처분하는 것이 불가능
      • 이를 위해 refresh token사용
      • refreshtoken은 길게, accesstoken짧게
      • refreshtoken은 DB저장, accesstoken DB저장X
  • 토큰 구현시 필요 라이브러리
    • spring-boot-starter-security 추가
      • jwt라이브러리 추가
      • filterchain 추가
      • filter구성 및 Controller 구성
      • login 성공시 프론트엔드에 jwt토큰 전달