Spring security, JWT, OAuth2 개념

minisoo·2024년 1월 21일
0
post-thumbnail

사이드 프로젝트를 시작하면서 Spring security, jwt, oauth2를 접하게 되었는데, 각 키워드에 대한 개념과 동작원리를 간단하게 정리해보고자 한다 😵‍💫

Spring security

spring 기반의 애플리케이션의 인증, 인가를 담당하면 스프링 하위 프레임워크로 Filter의 흐름에 따라 처리하게 된다

인증: 해당 사용자가 본인이 맞는지 확인하는 절차
인가: 인증된 사용자가 요청한 자원에 접근 가능한지 결정하는 절차

인증

  1. 로그인정보와 함께 HTTP 요청이 들어옴
  2. AuthenticationFilter가 요청 정보를 가지고 UsernamePasswordAuthenticationToken의 인증용 객체를 생성
  3. 생성된 인증을 AuthenticationManger에게 전달
  4. AuthenticationManger는 등록된 AuthenticationProvider를 조회하여 인증 요구
  5. AuthenticationManger는 UserDetailsService를 통해 입력받은 사용자 정보를 DB에서 조회
  6. 검증이 성공적으로 이루어지면, UserDetails를 생성
  7. AuthenticationFilter에게 Authentication(UserDetails+Authorities)가 반환됨
  8. 최종적으로 인증 객체를 SecurityContext에 저장

인가

  1. 사용자의 리소스 접근 요청
  2. FilterSecurityInterceptor 가 인증 여부 체크
  3. 인증이 완료되었다면 해당 리소스에 권한 필요한지 체크
  4. 권한이 필요 없는 리소스면 바로 접근 권한이 필요하면 AccessDecisionManager로 전달
  5. AccessDecisionManager와 Voter를 통해 사용자가 해당 필요한 권한을 가지고 있는지 판단
  6. 권한을 가지고 있다면 자원 접근, 그렇지 않다면 실패

JWT

인증에 필요한 정보들을 암호화시킨 JSON 형태의 토큰
JWT 기반 인증은 JWT 토큰을 HTTP 헤더를 통해 서버로 전송하여 서버가 클라이언트를 식별하는 방식

구조

헤더(header), 페이로드(payload), 서명(signature) 세 부분으로 이루어지며 각 구역이 .으로 구분된다

헤더: 토큰의 유형, 서명 알고리즘 종류가 담겨있음
페이로드: 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있음
서명: 헤더와 페이로드가 비밀키로 서명되어 저장됨

인증 과정

  1. 사용자 로그인 요청
  2. 서버에서 액세스토큰, 리프레시 토큰 발급
  3. 사용자에게 액세스 토큰 return
  4. 사용자는 엑세스 토큰과 함께 API 요청
  5. 서버는 엑세스 토큰이 유효하면 정상 응답
  6. 엑세스 토큰 만료 시, 리프레시 토큰을 이용하여 새로운 엑세스 토큰 발급

사용하는 이유

가장 큰 이유는 확장성이다
토큰 자체에 사용자의 정보가 저장되어 있기 때문에 서버에서는 토큰 검증만 하면 된다

반면 세션을 사용할 때는 사용자의 세션을 DB나 캐시에 저장해놓고 세션 ID로 사용자의 데이터를 조회하는 과정이 필요하다

JWT를 사용하게 되면 사용자가 늘어나더라도 사용자 인증을 위해 필요한 인프라 비용을 절감할 수 있게 된다
(인증 저장소가 필요 없음)

엑세스 토큰과 리프레시 토큰 분리 이유

엑세스 토큰: 서버 API 요청할 때 사용
리프레시 토큰: 엑세스 토큰 만료 시, 엑세스 토큰 재발급 목적으로 사용

클라이언트-서버간의 API 통신 중, 토큰이 탈취당할 수 있다
그래서 엑세스 토큰의 주기는 되도록 짧게 가져가고, 리프레스 토큰의 주기는 비교적 길게 한다

Oauth2

구글, 네이버, 카카오톡과 같은 플랫폼의 특정한 사용자 데이터에 접근하기 위해 제3자 클라이언트(우리 서비스)가 사용자의 접근 권한을 위임받을 수 있는 표준 프로토콜

구성 요소

Resource Owner
사용자, 정보의 주체로 액세스를 허용하거나 거부하는 권한을 갖고 있음

Authorization
Resource Owner를 인증하고, client에게 액세스 토큰을 발급해주는 서버

Resource Server
구글, 네이버, 카카오톡과 같이 리소스를 가지고 있는 서버

Client
Resource Server의 자원을 이용하고자하는 서비스, 우리가 개발하는 서비스


Spring Security 개념
Spring security 파헤치기
JWT 개념
OAuth 2.0 개념
OAuth 2.0 로그인 구현

profile
코딩하는 돌멩이 👻

0개의 댓글