스프링 시큐리티 + JWT 토큰

gyehwan·2023년 5월 30일
0

SpringBoot

목록 보기
1/3

DEPth 덕분에 드디어 블로그를 시작하게 되었다 !!
1주차 스터디 내용은 스프링 시큐리티와 jwt 토큰이다. 관련해서 공부한 내용들을 정리해보도록 하겠다.


🔒 스프링 시큐리티(Spring Security)란?

인증(Authentication)과 인가(Authorization), 공격에 대한 보호 등 보안에 관한 기능을 제공하는 프레임워크이다.

인증 (Authentication)

보호된 리소스에 접근하는 대상, 즉 사용자에게 적절한 접근 권한이 있는지 확인하는 일련의 과정을 의미한다. 이 때 보호된 리소스에 접근하는 대상(사용자)을 접근 주체(Principal)라고 한다.

인가 (Authorization)

인증절차가 끝난 접근 주체가 보호된 리소스에 접근 가능한지를 결정하는 것을 의미한다.

스프링 시큐리티는 인증, 인가 매커니즘을 간단하게 만들 수 있도록 다양한 옵션을 제공한다.

스프링 시큐리티의 구조

사용자가 로그인을 할 때, 스프링 시큐리티에서 어떤 일이 일어나는지 동작 플로우를 바탕으로 시큐리티의 아키텍쳐를 알아보자.
시큐리티 아키텍쳐

  1. 사용자가 로그인 정보와 함께 인증 요청(Http Request)

  2. AuthenticationFilter가 이 요청을 가로챈다. 이 때 가로챈 정보를 통해 UsernamePasswordAuthenticationToken이라는 인증용 객체를 생성

  3. AuthenticationManager의 구현체인 ProviderManager에게 UsernamePasswordAuthenticationToken 객체를 전달

  4. 다시 AuthenticationProviderUsernamePasswordAuthenticationToken 객체를 전달

  5. 실제 데이터베이스에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보(아이디)를 넘겨준다.

  6. 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다. 이 때 UserDetails 는 인증용 객체와 도메인용 객체를 분리하지 않고 인증용 객체에 상속해서 사용하기도 한다.

  7. AuthenticationProviderUserDetails를 넘겨받고 사용자 정보를 비교한다.

  8. 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환

  9. 다시 최초의 AuthenticationFilterAuthentication 객체가 반환

  10. Authentication 객체를 SecurityContext에 저장합니다.

최종적으로 SecurityContextHolder는 세션 영역에 있는 SecurityContextAuthentication 객체를 저장한다.

스프링 시큐리티 필터 (Filter)

스프링 시큐리티 필터

위의 그림은 시큐리티 필터가 동작하는 프로세스를 크게 나타낸 것이다.
큰 그림을 쪼개서 살펴보자.

Spring Security에서는 인증, 인가에 대한 처리를 여러 개의 필터를 연쇄적으로 실행하여 수행한다. 서비스마다 필요한 필터가 다를텐데, WebSecurityConfigurerAdapter를 구현한 설정 파일의 내용을 기반으로 해당되는 필터들을 생성한다.

여기서 실제 필터를 생성하는 클래스가 HttpSecurity이다.
생성된 필터 목록들은 WebSecurity로 전달되고, WebSecurityFilterChainProxy에 필터 목록을 전달한다.

🔑 JWT 토큰

JWT (Json Web Token)는 인증에 필요한 정보들을 암호화시켜 Token에 담은 것이다. JSON 객체를 암호화하여 만든 문자열 값으로 위,변조가 어렵다. 또한 다른 토큰들과 달리 토큰 자체에 데이터를 담고있다.

  • 헤더(header): 토큰 타입과 해싱 알고리즘 저장
  • 내용(payload): 실제로 전달할 정보
  • 서명(signature): 위변조를 방지하기위한 값
    헤더는 토큰 타입과 해싱 알고리즘을 저장하고, 내용은 실제로 전달할 정보, 서명에는 위변조를 방지하기위한 값이 들어가게 됩니다.


위 그림은 JWT가 사용자를 인증하는 프로세스를 간단히 나타낸 것이다.

사용자가 로그인 요청을 하면 서버는 사용자에게 정보를 담은 JWT를 생성하여 반환한다. 사용자는 권한이 필요한 API 요청을 할 때 마다 JWT를 헤더에 담아서 요청한다. 서버는 JWT를 확인하여 사용자가 해당 리소스에 권한이 있는지 체크하고 리소스를 제공하게 된다.

0개의 댓글

관련 채용 정보