Spring Security 구성할때 알아두어야 할것들
실무에서 자주 사용되는 Spring Security와 JWT로 구현하는 부분에 대해 정리하고 싶어서 이글을 작성했습니다.
처음 Security와 JWT를 연동할 때 개념에 대한 부족과 블로그의 글들은 버전이 오래되었거나 까다롭게 처리되고 있어 개념부터 알고 시작할 수 있도록 작성했습니다. 블로그 작성 부분에는 빠진 부분이 있을 수 있으니 git hub에 해당 주소로 들어가서 참고해 주세요!
Spring Security는 무엇일까?
Spring Security는 Spring에서 제공하는 보안 관련을 설정할 수 있도록 하는 스프링 하위 프레임워크입니다.
보안과 관련된 부분들을 Filter로 처리하게 됩니다. Intercepter는 Dispatcher와 Controller 사이에 위치해서 적용되지만 Filter로 적용하게 되면 이전에 처리되므로 차이가 있습니다.
Filter와 intercepter
필터란 Dispatcher Servlet에 요청이 전달되기 전 스프링 외부에서 들어올 때 클라이언트가 요청한 URL에 맞는 모든 요청에 대해 부가적인 작업을 처리할 수 있는 기능을 제공합니다. 필터링을 거친다고 생각하시면 쉽고 @Order 어노테이션으로 요청에 대한 순서를 지정해 줄 수 있습니다.
인터셉터란 Spring 내에서 Dispatcher Servlet이 컨트롤러를 호출하는 그사이에 요청한 URL에 대해 부가적인 작업을 처리할 수 있는 기능을 제공합니다. 필터는 공통된 어떤 작업을 처리한다면 인터셉터는 AOP처럼 사용되며 작은 소규모의 추가 인증 같은 부가적인 작업을 처리할 때 사용합니다. 사실 구현하기 나름이라 보이기에는 둘 다 비슷하게 작동하니 특정 로직에 대한 정답은 없는 것 같습니다. 자신만의 기준점을 두는 게 나을 것 같습니다.
Security의 구성요소
SecurityContextHolder는 Security Context 의 세부 정보가 저장되는 곳이라고 생각하면 됩니다.
Security Context는 Authentication을 보관하고, 이를 통해 정보를 가져올 수 있습니다.
SecurityContextHolder의 자식은 Security Context이고 Security Context의 자식은 Authentication을 가지게 되며
변경되거나 꺼내올 때도 이를 통해 가지고 온다는 점만 기억해서 두면 될 것 같습니다. 이를 통해 인증에 성공해서 생성된 UserDetails는 해당 인증된 사용자의 정보를 가져오는 역할을 합니다. 여기에는 UserDetailsService 인터페이스가 존재하는데, loadByusername이란 메서드를 통해 사용자 정보에 대한 값들을 지정해 줄 수 있습니다. UserDetails 클래스를 자세히 살펴보면 Granted Authority가 있습니다. 이는 사용자가 가지고 있는 권한을 의미하며 ROLE_ADIN, ROLE_USER와 같이 권한의 네이밍을 지정합니다.
이를 통해 권한별 접근을 설정할 수 있습니다.
이를 정리해 보자면 Security Session → Authentication → UserDetails
- 스프링 시큐리티는 오는 모든 접근 주체에 대해 Authentication을 생성한다.
- Authentication은 Security Context에 저장된다.
- Security Context는 SecurityContextHolder 가 관리한다.
- SecurityContextHolder 가 메모리 저장소에 저장하고 꺼내서 사용한다.
- Granted Authority는 권한을 지정해 주고 접근을 권한별로 제어하는 역할을 한다.
이렇게 기본 개념들을 참고하여 다음 글에는 Sequrity와 JWT 개념에 대해 알아보겠습니다.
'Spring' 카테고리의 다른 글
[JPA] JPA 개념과 기본 설정 가이드 (0) | 2024.01.29 |
---|---|
[Spring] SpringBoot JWT 로그인 구현 가이드 (1) | 2024.01.26 |
[Spring] SpringBoot Swagger 연동 (3.x ver) (0) | 2024.01.10 |
[Spring] SpringBoot Sequrity + JWT 구현 (3.x ver) (0) | 2024.01.06 |
[Spring] 스프링 부트 멀티 모듈 프로젝트 구성하기 (gradle, yml 설정, 3.x ver) (0) | 2024.01.02 |