Spring

[Security]Spring Security와 JWT

joje* 2024. 12. 9. 17:18

1. 스프링 시큐리티란?

 

스프링 시큐리티는 사용자의 인증, 인가와 관련해 스프링 프레임 워크에서 제공하는 하위 프로젝트를 의미한다.

앞선 정의에서 인증과 인가란 아래와 같이 정의할 수 있다.

인증: 사용자가 누구인지 확인
인가: 인증을 통해 신원이 보장된 사용자가 리소스에 접근할 때, 접근 권한이 있는지를 확인

 

 

2. 스프링 시큐리티를 이용한 인증

 

- 스프링 시큐리티를 이용할 경우 서블릿 필터를 기반으로 작동하며, DelegatingFilterProxy를 이용해 시큐리티가 제공하는 FilterChainProxy를 필터체인에 등록하게 된다. 이후 FilterChainProxy는 SecurityFilterChain을 통해 인증과 관련된 여러 필터체인들을 선택해 이용하도록 한다.

 

이미지 출처: https://docs.spring.io/spring-security/reference/servlet/architecture.html

 

- 별도의 설정이 없다면 FilterChainProxy는 SecurityFilterChain 중 UsernamePasswordAutheticationFilter를 이용해 인증 작업을 처리하게 되고 아래와 같은 과정을 통해 인증작업이 이루어지게 된다.

 

이미지 출처: https://velog.io/@hope0206/Spring-Security-%EA%B5%AC%EC%A1%B0-%ED%9D%90%EB%A6%84-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%97%AD%ED%95%A0-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

 

1. 클라이언트가 서버측에 인증요청(HttpRequest)

 

2. 시큐리티 필터체인 중 인증을 담당하는 AuthenticationFilter가 요청을 처리하기 위해 인증요청을 처음 받음. AuthenticationFilter는 UsernamePasswordAuthenticationToken을 이용해 인증요청에 필요한 사용자 정보를 토큰 형태로 만들어 AuthenticationManager로 요청을 전달

 

3. AuthenticationManager는 구현체인 ProviderManager로 요청을 전달

 

4. ProviderManager는 등록된 AuthenticationProvider중에서 적합한 AuthenticationProvider를 찾아 인증을 처리할 수 있도록 요청을 전달

 

5. AuthenticationProvider는 UserDetailsService를 이용해 데이터베이스에서 매칭되는 정보를 UserDetails에 담아 반환

 

6. 반환된 UserDetails 객체는 AuthenticationProvider의 구현체를 이용해 인증처리를 완료시킴. 인증이 완료된 정보는 Authenticaiton 객체에 담겨 반환

 

7. Authenticaiton 객체는 ProviderManager, AuthenticationManager를 거쳐 SecutiryContextHolder의 SecurityContext에 저장되어 인증에 이용

 

 

- 앞선 인증절차에 이용된 각 객체들의 역할은 아래와 같다. 

 

1) AuthenticationManager

: AuthenticationManager 인터페이스는 인증을 실행할 적절한 AuthenticationProvider를 선택하고 이를 호출한다. AuthenticationManager는 인증요청을 처리할 수 있는 여러 유형의 AuthenticationProvider를 지닐 수 있다. 

2) ProviderManager
: AuthenticationProvider에 등록된 Provider 중 인증을 처리할 수 있는 적절한 Provider를 찾아 매칭시켜 준다. 

3) AuthenticationProvider
: 인증에 필요한 로직을 담고 인증과 관련된 처리를 수행하는 인터페이스로 DaoAuthenticationProvider, JwtAuthenticationProvider와 같은 구현체를 이용해 인증 작업을 처리한다.

또한 authenticate() 메서드를 구현하고 이를 처리한 후 인증이 완료된 정보를 Authentication 객체에 담아 반환한다. 

4) Authentication
: 인증이 완료된 정보를 담고 있는 객체로 이들은 추후 SecurityContext에 저장된다.

 

 

3. 스프링 시큐리티 인증과 JWT를 이용한 스프링 시큐리티 인증의 차이

 

- 스프링 시큐리티를 이용한 인증이 가지는 특징 중 하나는 인증에 대한 정보가 세션에 저장되어 서버측에서 이를 관리한다는 점이다. 이는 클라이언트 측에서 인증과 관련된 정보를 저장하고 관리하는 JWT를 활용한 인증방식과 차이를 지니게 된다. 

 

4. JWT(Json Web Token)란?

 

- 스프링 시큐리티 기반의 JWT 인증은 인증에 대한 정보를 서버측에서 인코딩을 통한 토큰 형태로 발급해 이를 서버가 아닌 클라이언트 측에서 관리하도록 하는 방식을 의미한다. 

 

- JWT 토큰에 들어가 있는 정보는 아래와 같이 세 개의 부분(Header, Payload, Signature)으로 구성된다. 

 

1) Header, Payload: base64Url 인코딩을 통해 인코딩 된 문자열이 들어간다. Payload에 포함된 각각의 항목들을 Claim이라고 부른다.

 

2) Signature: Header, Payload의 정보가 base64Url 형태로 인코딩 된 후 서버에 저장된 secterKey 값과 Header에서 정의한 알고리즘 방식으로 서명한 문자열이 base64Url로 인코딩 되어 들어간다.

 

이미지 출처: https://velog.io/@fill0006/JWTJSON-Web-Token-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%EC%9D%B4%ED%95%B4

 

 

-  JWT 토큰을 이용한 인증방식은 세션을 통한 인증방식에 비해 확장성이 뛰어나고 서버에서 인증 정보를 관리할 필요가 없어 인증 요청 시 서버에 부하를 줄일 수 있다.

단, 클라이언트에서 인증과 관련된 정보를 관리해 네트워크에 부담을 줄 수 있고, 토큰 자체를 탈취당할 경우 유효 기간 내에 이를 취소하거나 무효화하는 것이 어려워 보안에 취약할 수 있다는 단점이 있다

 

 

- 참고한 사이트

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

 

🌐 JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰)

Cookie / Session / Token 인증 방식 종류 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해

inpa.tistory.com

 

- 참고서적

장정우.스프링 부트 핵심 가이드.위키북스.2022