스프링 시큐리티에 대해 알아본다.

스프링 시큐리티란?
Spring Security는 인증, 권한, 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크
일반적으로 로그인,로그아웃,세션관리, 권한관리 등 개발자들의 보안 관련 기능을 효율적이고 신속하게 구현할 수 있도록 도와준다.
스프링 시큐리티 사용하는 이유?
시큐리티를 사용하지 않고 코드를 직접 작성하면 IoC/DI 패턴과 같은 확장 패턴을 염두해서 인증/인가 부분을 직접 개발하기는 쉽지 않다. 하지만 스프링 시큐리티는 이와 같은 기능들을 제공해 주어서 개발 작업 효율을 높일 수 있다.
스프링 시큐리티 아키텍처는 무엇인가요?

스프링에서 프레임워크나 라이브러리를 사용했을 때, 작동되는 구조를 표현한 그림이다.
붉은색 박스 부분이 스프링프레임워크에서 스프링 시큐리티가 적용되는 부분이다.
1. 사용자의 요청이 서버로 들어옵니다.
2. Authotication Filter가 요청을 가로채고 Authotication Manger로 요청을 위임합니다.
3. Authotication Manager는 등록된 Authotication Provider를 조회하며 인증을 요구합니다.
4. Authotication Provider가 실제 데이터를 조회하여 UserDetails 결과를 돌려줍니다.
5. 결과는 SecurityContextHolder에 저장이 되어 저장된 유저정보를 Spring Controller에서 사용할 수 있게 됩니다.
이게 Spring 과의 상호작용이다.
스프링 시큐리티 내부 구조

1. 사용자가 자격 증명 정보를 제출하면, AbstractAuthenticationProcessingFilter가 Authentication 객체를 생성합니다.
2. Authentication 객체가 AuthenticationManager에게 전달됩니다.
3. 인증에 실패하면, 로그인 된 유저정보가 저장된 SecurityContextHolder의 값이 지워지고 RememberMeService.joinFail()이 실행됩니다. 그리고 AuthenticationFailureHandler가 실행됩니다.
4. 인증에 성공하면, SessionAuthenticationStrategy가 새로운 로그인이 되었음을 알리고, Authentication 이 SecurityContextHolder에 저장됩니다. 이후에 SecurityContextPersistenceFilter가 SecurityContext를 HttpSession에 저장하면서 로그인 세션 정보가 저장됩니다.
그 뒤로 RememberMeServices.loginSuccess()가 실행됩니다. ApplicationEventPublisher가 InteractiveAuthenticationSuccessEvent를 발생시키고 AuthenticationSuccessHandler 가 실행됩니다.
Spring Security을 적용하기 전에 이런 흐름을 가지고 작동한다는 것을 알아두면 도움이 된다. 사실 아키텍처나 처리 과정들은 구글링을 통하여 가볍게 구현 방법을 알 수 있기 때문에 이러한 과정들을 몰라도 실무에서 구현하는 데는 문제가 전혀 없다.
하지만 이러한 과정을 이해하고 있을 경우 Spring Security를 상황에 맞춰 적용하기 수월하다. Spring Security의 작동 구조를 알고 있기 때문에, 작업을 빠르게 진행할 수 있고, 업무 효율도 더 올릴 수 있다.
때문에 Spring Security 아키텍처와 처리 과정을 이 글을 통해 꼭 한 번 상기해 보시는 것을 추천드리며, 부족한 부분은 실무에서 직접 경험하면서 채워나간다면, Spring Security를 다양한 환경에 적용할 수 있을 것이다.
스프링 시큐리티를 사용하는 방법

gradle 추가

설정한적없는 로그인 페이지가 나타난다.
스프링 시큐리티는 기본적인 아이디/패스워드 인증화면까지 지원한다.

이러면 로그인 창이 뜨지않는다. -> 모든 url을 허용하겠다는 의미라서
스프링에서는 WebSecurityConfig라는 클래스에서 모든 관련 설정을 간단히 할 수 있다. 그래서 내부의 비즈니스 로직에는 영향을 덜 미치게 된다.

스프링 시큐리티 인증, 인가 처리하기
인증: 말 그대로 누구인지 확인하는 것
스프링시큐리티필터체인부분에 formLogin 부분을 추가해주면 기본 스프링에서 제공하는 화면이 제공된다.
로그인이 처리되면 아이디가 user1, 비밀번호가 1234인 유저정보가 픽스된다.
마지막으로 passwordEncoder부분에는 패스워드가 인코딩해야 한다는 보안 부분을 강제하기 떄문에 추가해야한다. 이 부분을 Spring에서는 강제로 적용해 놓았다.

인가는 이 사람이 어떤거를 접근할 수 있는지에 대한 권한이 이라고 볼 수 있다.
hasRole이라는 함수를 사용해 api1 요청에는 user만, api2 요청에는 admin만 페이지에 접근할 수 있도록 하였다.

테스트를 해본다.

처음에는 user이기 때문에 api1 호출이 잘 된다.

하지만 api2는 admin만 권한이 있기 때문에 접근하지 못하게된다.
이렇게 인가 기능을 기존의 코드 부분을 수정하지 않고도 스프링 설정부분만 간단하게 수정함으로써 적용이 가능한다.
'백엔드 > 뎁스스터디' 카테고리의 다른 글
5- 동시성 처리 (2) (1) | 2024.05.28 |
---|---|
5- 동시성 처리 (1) (0) | 2024.05.20 |
4- 스프링 시큐리티 + jwt(2) (0) | 2024.05.13 |
2- TDD(2) (1) | 2024.04.07 |
1- TDD(1) (0) | 2024.04.02 |