일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- QueryDSL
- ci/cd
- sqlserver
- mssql
- rabbitmq
- 자동빌드
- 자바8
- 자동배포
- Jenkins
- ORM
- apache.poi
- 엑셀 업로드
- Stream
- MessageQueue
- mom
- stream api
- DevOps
- 스트림
- java
- poi
- Javascript
- spring
- 보안
- 그리드
- 대용량 업로드
- jqGrid
- JQuery
- docker
- 제이쿼리그리드
- JPA
- Today
- Total
개발 메모장
[Spring] 스프링 시큐리티(Spring Security) 본문
#. 스프링 시큐리티란 무엇인가?
- Spring Framework를 기반의 사용자 정의가 가능한 인증 및 인가를 통한 접근 제어 프레임워크입니다.
- 인증, 권한 부여, 인가, 세션 관리, CSRF(Cross-Site Request Forgery) 및 XSS와 같은 일반적인 웹 취약성에 대한 보호를 포함하여 다양한 보안 위협으로부터 애플리케이션을 보호하는 포괄적인 보안 기능을 제공하는 프레임워크입니다.
#. 주요 기능
1. 인증(Authentication)
- HTTP 기본, 다이제스트, 양식 기반 인증, LDAP, OAuth 등과 같은 다양한 메커니즘을 사용하여 사용자를 인증할 수 있으며 데이터베이스, LDAP 서버, 사용자 정의 인증 공급자 및 외부 ID 공급자를 통한 사용자 인증을 지원합니다.
2. 인가(Authorization)
- 인증 이후 세분화된 접근 제어를 통해 애플리케이션 내의 리소스를 보호합니다.
- 역할, 권한, 표현식 또는 사용자 정의 논리를 기반으로 액세스 규칙을 정의하여 애플리케이션의 특정 부분에 액세스 할 수 있는 사용자를 제어할 수 있습니다.
3. 세션관리
- 세션 고정 보호, 동시 세션 제어, 세션 타임아웃 등 사용자 세션 관리 기능을 제공합니다.
4. 공격에 대한 보호
- 내장된 메커니즘과 모범 사례를 제공하여 CSRF, XSS, SQL 삽입 및 Click-jacking과 같은 일반적인 웹 취약성으로부터 애플리케이션을 보호하는 데 도움을 줍니다.
#. 처리 프로세스
- 스프링 시큐리티는 필터 기반으로 동작합니다.
- 따라서 Servlet으로 가기 전 필터 체인 내 필터를 통해 시큐리티 필터 체인을 거쳐 스프링 시큐리티가 적용됩니다.
(Client -> Filter -> Servlet -> InterCeptor -> Controller)

#. 시큐리티 필터 체인
- 필터 체인을 구성하는 주요 필터들에 대해 살펴보도록 하겠습니다.
1. SecurityContextPersistenceFilter
- 각 요청에 대해 구성된 SecurityContextHolder에서 SecurityContext를 로드하는 역할을 담당합니다.
2. LogoutFilter
- 로그아웃 요청을 처리할 때 인증정보를 삭제하고 세션을 무효화하는 로그아웃 기능을 수행합니다.
3. UsernamePasswordAuthenticationFilter
- 제출된 인증 요청을 처리하며 요청에서 사용자이름과 비밀번호를 읽고 사용자 인증을 시도하며 성공하면 인증 토큰을 생성합니다.
4. BasicAuthenticationFilter
- HTTP 헤더에서 사용자 이름과 비밀번호를 추출하고 사용자 인증을 시도하는 기본 인증을 처리합니다.
5. RememberMeAuthenticationFilter
- 쿠키 또는 기타 메커니즘에 저장된 영구 토큰을 기반으로 사용자를 자동으로 로그인이 가능토록 합니다.
6. ExceptionTranslationFilter
- 시큐리티 처리 중 발생한 예외를 적절한 HTTP 응답으로 변환합니다.
7. FilterSecurityInterceptor
- 요청한 URL과 사용자에게 부여된 권한을 기반으로 접근 권한 확인 및 접근 제어 규칙(인증)을 시행합니다.
8. CsrfFilter
- 승인되지 않은 요청이 처리되는 것을 방지하기 위해 들어오는 요청에서 CSRF 토큰을 검증하여 공격으로부터 보호합니다.
9. HeaderWriterFilter
- 일반적인 웹 취약점을 완화하기 위해 HTTP 응답에 X-Frame-Options, X-Content-Type-Options 및 Content-Security-Policy 등과 같은 보안 관련 헤더를 추가합니다.
#. Spring Security 사용을 위해 추가해야 할 라이브러리
- spring-security-core
- 스프링 시큐리티의 핵심 라이브러리로서 스프링 시큐리티에서 제공하는 인증, 권한 부여, 보안 기능 등을 구현하는 데 사용됩니다. - spring-security-web
- HTTP 요청 처리를 위한 필터, 웹 관련 보안 문제 처리 지원, 서블릿 컨테이너와의 통합 등 웹 애플리케이션 보안과 관련된 구성 요소 및 기능이 포함되어 있습니다. - spring-security-config
- XML 또는 Java 구성을 사용하여 Spring Security 구성을 지원하며 보안 구성 설정, 보안 규칙 정의, 인증 및 권한 부여 메커니즘 사용자 정의를 위한 클래스와 유틸리티가 포함되어 있습니다. - spring-security-taglibs
- 사용자의 인증 및 권한 부여 상태를 기반으로 사용자 인터페이스의 일부를 보호하기 위해 Spring MVC 뷰에서 사용할 수 있는 태그 라이브러리를 제공합니다. - spring-aop
- 스프링 시큐리티에서는 AOP를 사용하여 메서드 수준에서 보안을 적용합니다. - spring-context
- 스프링 시큐리티 전체에 사용되는 필수 개념인 IoC(Inversion of Control) 및 DI(Dependency Injection)를 포함하여 Spring 애플리케이션에 대한 기본 지원을 제공합니다. - spring-expression
- 스프링 프레임워크의 표현 언어 기능을 구현하는 데 필요한 라이브러리입니다. 스프링 시큐리티에서는 표현 언어를 사용하여 권한 부여 규칙을 작성합니다.
#. Spring Security access 표현식
<http auto-config="true" use-expressions="ture" access-decision-manager-ref="accessdDecisionManager">
<headers>
<frame-options policy="SAMEORIGIN" />
</headers>
<interceptor-url pattern="적용할 uri" access="접근권한" />
</http>
- authenticated; 인증된 사용자의 접근을 허용
- fullyAuthenticated: 인증된 사용자의 접근을 허용, rememberMe인증 제외
- permitAll : 무조건 허용
- denyAll : 무조건 차단
- anonymous : 익명사용자 허용
- rememberMe : rememberMe 인증 사용자 접근 허용
- access(String): 주어진 SpEL표현식의 평가 결과가 true 이면 접근허용
- hasRole(String): 사용자가 주어진 역할이 있다면 접근을 허용
- hasAuthority(String): 사용자가 주어진 권한이 있다면 허용
- hasAnyRole(String...): 사용자가 주어진 어떤 권한이라도 있으면 허용
- hasAnyAuthority(String...): 사용자가 주어진 권한중 어떤 것이라도 있다면 허용
- hasIpAddress(String): 주어진 IP로부터 요청이 왔다면 접근을 허용
#. security.xml 내 access 표현식 사용 시 Bean 설정
- 스프링 시큐리티 3.2 이상부터는 아래와 같이 XML을 별도 설정하지 않아도 config에서 설정을 할 수 있습니다.
- 아래 내용은 그 이하 또는 기존 프로젝트가 xml을 사용하는 경우 작성하는 예시입니다.
- bean 설정을 통해 custom으로 만든 핸들러 및 필터를 내부 기준에 맞게 처리합니다.
<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
<beans:constructor-arg name="decisionVoters">
<beans:list>
<beans:bean class="org.springframework.security.access.vote.RoleVoter" />
<beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
<beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter" />
</beans:list>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="authenticationFailureHandler" class="경로.CustomAdminFailureHandler" />
<beans:bean id="loginSuccessHandler" class="경로.CustomLoginSuccessHandler" />
<beans:bean id="logoutSuccessHandler" class="경로.CustomLogoutSuccessHandler" />
<beans:bean id="userAuthProvider" class="경로.CustomAuthenticationProvider"/>
<beans:bean id="customUserDetailsService" class="경로.CustomUserDetailsService" />
#. security.xml 내 CSRF 자동처리 막기
- 스프링 시큐리티 4.0 이상부터는 CSRF를 자동으로 막게끔 보안처리 되어있음
- 따라서 이 기능을 사용하지 않기 위해선 아래와 같은 방법을 통해 처리 가능
// security.xml에서 http 태그 안에 추가
<csrf disabled="true">
===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================
'Spring' 카테고리의 다른 글
[Spring] Swagger 3.0 - API 문서화 (0) | 2024.07.04 |
---|---|
[Spring] Swagger(스웨거) 사용방법 (0) | 2024.02.19 |