DEPth
덕분에 드디어 블로그를 시작하게 되었다 !!
1주차 스터디 내용은 스프링 시큐리티와 jwt 토큰이다. 관련해서 공부한 내용들을 정리해보도록 하겠다.
인증(Authentication)과 인가(Authorization), 공격에 대한 보호 등 보안에 관한 기능을 제공하는 프레임워크이다.
보호된 리소스에 접근하는 대상, 즉 사용자에게 적절한 접근 권한이 있는지 확인하는 일련의 과정을 의미한다. 이 때 보호된 리소스에 접근하는 대상(사용자)을 접근 주체(Principal)라고 한다.
인증절차가 끝난 접근 주체가 보호된 리소스에 접근 가능한지를 결정하는 것을 의미한다.
스프링 시큐리티는 인증, 인가 매커니즘을 간단하게 만들 수 있도록 다양한 옵션을 제공한다.
사용자가 로그인을 할 때, 스프링 시큐리티에서 어떤 일이 일어나는지 동작 플로우를 바탕으로 시큐리티의 아키텍쳐를 알아보자.
사용자가 로그인 정보와 함께 인증 요청(Http Request)
AuthenticationFilter
가 이 요청을 가로챈다. 이 때 가로챈 정보를 통해 UsernamePasswordAuthenticationToken
이라는 인증용 객체를 생성
AuthenticationManager
의 구현체인 ProviderManager
에게 UsernamePasswordAuthenticationToken
객체를 전달
다시 AuthenticationProvider
에 UsernamePasswordAuthenticationToken
객체를 전달
실제 데이터베이스에서 사용자 인증정보를 가져오는 UserDetailsService
에 사용자 정보(아이디)를 넘겨준다.
넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails
객체를 만든다. 이 때 UserDetails
는 인증용 객체와 도메인용 객체를 분리하지 않고 인증용 객체에 상속해서 사용하기도 한다.
AuthenticationProvider
는 UserDetails
를 넘겨받고 사용자 정보를 비교한다.
인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication
객체를 반환
다시 최초의 AuthenticationFilter
에 Authentication
객체가 반환
Authentication
객체를 SecurityContext
에 저장합니다.
최종적으로 SecurityContextHolder
는 세션 영역에 있는 SecurityContext
에 Authentication
객체를 저장한다.
위의 그림은 시큐리티 필터가 동작하는 프로세스를 크게 나타낸 것이다.
큰 그림을 쪼개서 살펴보자.
Spring Security에서는 인증, 인가에 대한 처리를 여러 개의 필터를 연쇄적으로 실행하여 수행한다. 서비스마다 필요한 필터가 다를텐데, WebSecurityConfigurerAdapter
를 구현한 설정 파일의 내용을 기반으로 해당되는 필터들을 생성한다.
여기서 실제 필터를 생성하는 클래스가 HttpSecurity
이다.
생성된 필터 목록들은 WebSecurity
로 전달되고, WebSecurity
는 FilterChainProxy
에 필터 목록을 전달한다.
JWT (Json Web Token)
는 인증에 필요한 정보들을 암호화시켜 Token에 담은 것이다. JSON 객체를 암호화하여 만든 문자열 값으로 위,변조가 어렵다. 또한 다른 토큰들과 달리 토큰 자체에 데이터를 담고있다.
위 그림은 JWT
가 사용자를 인증하는 프로세스를 간단히 나타낸 것이다.
사용자가 로그인 요청을 하면 서버는 사용자에게 정보를 담은 JWT를 생성하여 반환한다. 사용자는 권한이 필요한 API 요청을 할 때 마다 JWT를 헤더에 담아서 요청한다. 서버는 JWT를 확인하여 사용자가 해당 리소스에 권한이 있는지 체크하고 리소스를 제공하게 된다.