지금 실무에서 사용하고 있는 스프링 보안은 인터셉터를 활용하여 구현되어 있으나, 필터를 기반으로 동작하는 스프링 시큐리티에 대해서 확실히 알 필요가 있다고 생각하여(사용은 해보았지만..원리는 잘 모르고 썼었다), 정리해보려고 한다.
1. 스프링 시큐리티의 정의
- 스프링 기반의 애플리케이션의 보안을 담당하는 프레임워크이다. 시큐리티를 사용하지 않고 직접 인증, 인가를 구현한다면, 자체적으로 세션을 체크하고, 페이지를 redirect 해주는 등 직접 손보아야 할 일이 많아질 것이다.
2. 보안 관련 용어 정의
- 접근 주체(Principal) : 보호된 대상에 접근하는 유저
- 인증(Authenticate) : 현재 접근하는 유저가 누구인지 확인, 애플리케이션의 작업을 수행할 수 있는 주체임을 증명
- 인가(Authorize) : 접속한 유저가 어떤 서비스와 페이지에 접근 할 수 있는 권한이 있는지 검사
- 권한 : 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 되어있는지 결정
- 권한 승인이 필요한 부분으로 접근하려면 인증 과정을 통해 주체가 증명 되어야 한다.
- 권한 부여 영역
- 웹 요청 권한
- 메소드 호출 및 도메인 인스턴스에 대한 접근 권한
아키텍처
시큐리티 동작 프로세스
- 유저가 로그인을 시도 (http request)
- AuthenticationFilter 에서부터 위와같이 user DB까지 타고 들어감
- DB에 있는 유저라면 UserDetails 로 꺼내서 유저의 session 생성
- spring security의 인메모리 세션저장소인 SecurityContextHolder 에 저장
- 유저에게 session ID와 함께 응답을 내려줌
- 이후 요청에서는 요청쿠키에서 JSESSIONID를 까봐서 검증 후 유효하면 Authentication를 쥐어준다.
시큐리티 세션 등록 과정
- 세션에 시큐리티 컨텍스트(Authentication 객체만 저장 가능)가 생성이 되고, Authentication 객체가 생성됨.
- Authentication 객체는 AuthenticationManager가 만드는데, 사용자가 로그인 요청을 하면 username과 password를 바탕으로 AuthenticationFilter(인증필터)가 가로채서 UsernamePasswordAuthenticationToken을 생성하여 AuthenticationManager에 던지면 AuthenticationManager가 세션을 만든다.
- 조건 : username이 UserDetailSservice에게 보내 UserDetailsService가 DB에 username이 있는지 질의를 한다 .
- 조건에 부합한다면 패스워드를 Bcrypt로 암호화하여 DB에 암호화된 password가 맞는지 확인하여 맞다면, Authentication 객체를 만들어 세션에 저장
ps. 스프링 시큐리티는 한 포스팅으로 다 담기에는 너무 영역이 넓다. 나누어서 포스팅 할 예정..
'개발 > Spring' 카테고리의 다른 글
[Spring] Security와 Jwt 사용을 통한 인증, 인가 도입기 (0) | 2023.06.25 |
---|---|
[Spring] Bean을 Collection으로 호출하기 (0) | 2023.05.21 |
[Spring]빈 스코프와 Provider (0) | 2022.03.20 |
[Spring]Lombok(롬복) (0) | 2022.03.13 |
[Spring]@ComponentScan (0) | 2022.03.12 |