토큰 기본 개념
토큰 기반 인증 시스템의 구현체인 JWT(JSON Web Tokens)가 웹 표준으로 등록되어 있어, jwt 토큰방식이라 불림
토큰 생성
로그인 시도시 토큰 방식에서는 서버는 사용자에게 인증 토큰을 생성하여 제공
클라이언트 측에서 전달받은 토큰을 localstorage에 저장
토큰의 구성
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토큰 전달