직접 프로젝트를 통해서 스프링 시큐리티의 동작을 먼저 살펴보자
스프링 시큐리티 스프링의 여러 하위 프로젝트 중에 하나이므로,https://spring.io/projects/spring-security
Spring Security
Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements
spring.io
그리고 다양한 처리를 위해 의존성을 주입하자
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
기존 프로젝트에 의존성을 주입했다.
Security-context.xml 을 생성
스프링 시큐리티는 단독으로 설정할 수 있기 때문에 기존의 root-context.xml이나 servlet-context.xml과는 별도로
security-context.xml을 따로 작성하는 것이 좋다.
security-context.xml파일은 메뉴에서 Spring Bean Congiguration File메뉴를 통해서 생성하거나 일반 xml파일로 생성할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
Web.xml 설정
스프링 시큐리티가 스프링 MVC에서 사용되기 위해서 필터를 이용해서 스프링 동작에 관여하도록 설정한다.
web.xml파일에 아래코드를 입력한다.
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml에 필터를 적용한 후 프로젝트를 실행해보면 아래와 같이 에러가 발생한다.
에러의 원인은 빈이 제대로 설정되지 않아서 발생한다고 나온다.
시큐리티컨텍스트xml을 로딩하도록 설정하는 작업과 시큐리티컨텍스트xml에 최소한의 설정을 해주어야 하는데
뺴먹고 진행하였다. 그것을 채워 넣도록 하자
우선 web.xml에서 시큐리티 컨텍스트가 로딩되로고 추가하는 코드이다.
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml
/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
루트컨텍스트 밑에 한줄을 추가해주었다.
이제 로딩될 시큐리티 컨텍스트에 내용을 추가해주자
<security:http>
<security:form-login />
</security:http>
<security:authentication-manager>
</security:authentication-manager>
스프링시큐리티가 동작하기 위해서는 Authenication Manager라는 존재와 스프링 시큐리티의 시작 지점이 필요하기 때문에 위와같이 최소한의 설정을 지정한 후에 실행한다.
그럼 에러가 발생하지 않는 것을 확인한다.
시큐리티가 필요한 URI 설계
스프링 시큐리티의 최소한의 설정이 완료되었다면, 시큐리티에 의해 제어가 필요한 URI를 설계하고 적용하도록 한다.
예제는 다음과 같은 URI를 설계한다.
- /sample/all -> 로그인을 하지 않은 사용자들도 접근 가능한 URI
- /sample/member -> 로그인을 한 사용자들만 접근할 수 있는 URI
- /sample/admin -> 로그인 사용자들 중에서 관리자 권한을 가진 사용자만이 접근할 수 있는 URI
컨트롤 패키지에 SampleConteroller를 작성하고 해당 URI에 맞는 매서드를 작성한다.
@GetMapping("/all")
public void doAll() {
log.info("do all can access everybody");
}
@GetMapping("/member")
public void doMember() {
log.info("logined member");
}
@GetMapping("/admin")
public void doAdmin() {
log.info("admin only");
}
http://localhost:8080/sample/all , member , admin 이렇게 동작가능을 하는지보자,
동작은 하지만, 아직 뷰단계를 만들지않아서 페이지로는
따라서 view단계를 위해 대충만들어보도록하자, 구별만 가도록!
우선 일단 회원, 모든사람, 관리자 이렇게 했다.
admin, alll, member, 생성했고 각 내용은
<h1>태그를 이용해서 알아볼수 있을정도만 하였다.
이정도만으로..
인증(Authentication)과 권한 부여(Authorization - 인가)
스프링 시큐리티의 동작을 이해하기 위해서는 가장 중요한 용어인 인증과 권한에 대한 이해이다.
다시한번더 설명하자면,
인증은 쉽게말해 자신을 증명하는 것, 자기 스스로가 무언가 자신을 증명할 만한 자료를 제시하는 것이다.
권한부여는 남에 의해 자격이 부여된다는 점이다.
시큐리티의 개념을 어떤 회사에 방문하는 장면으로 비유하는 이해하기 편할것이다.
신분증검사-> 허가된 사람이다.? -> 허가증 패용 -> 그 허가증에 적힌 권한대로 할수있음(사장이아닌데 사장실 등락날락 안되듯이)
스프링 시큐리티의 내부에도 이와 비슷한 구조를 가지고있다.
스프링 시큐리티에서 가장 중요한 역할을 하는 존재가 인증을 담당하는 인증메니저라는 존재이다.
인증매니저는 다양한 방식의 인증을 처리할 수 있도록 설계가 되어있다.
ProviderManager는 인증에 대한 처리를 AuthenticationProvider라는 타입의 객체를 이용해서 처리를 위임한다.
인증제공자는 실제 인증 작업을 진행한다. 이때 인증된 정보에는 권한이나 정보를 같이 전달하게 되는데, 이처리는 UserDetailsService라는 존재와 관련이이싿.
UserDetailsService 인터페이스의 구현체는 실제로 사용자의 정보와 사용자가 가진 권한의 정보를 처리해서 반환한다.
개발자가 스프링 시큐리티를 커스터마이징하는 방식은 크게 AuthenticationProvider를 직접 구현하는 방식과 실제 처리를
담당하는 UserDetailsService를 구현하는 방식으로 나누어진다.
대부분의 경우 유저상세서비스를 구현하는 형태를 사용하는 것으로 충분하나, 새로운 프로토콜이나 인증 구현 방식을 직접
구현하는 경우에는 AuthenticationProvider인터페이스를 직접 구현해서 사용한다
'Spring공부 > 4-스프링시큐리티' 카테고리의 다른 글
커스텀 UserDetailsService (0) | 2021.10.19 |
---|---|
JDBC를 이용하는 간편 인증/ 권한처리 (0) | 2021.10.18 |
로그인과 로그아웃처리(2) (0) | 2021.10.18 |
로그인과 로그아웃 처리 (0) | 2021.10.18 |
Spring Web Security를 이용한 로그인처리 (0) | 2021.10.18 |
댓글