시큐리티
오늘 목표: 이 필터 3개를 날리자
컨테이너 두가지 사용중 ㅌ톰캣 컨테이너, 스프링 컨테이너
우리는 스프링 컨테이너 에 넣어서 사용중인데
필터체인은 컨테이너 밖에 유지한다.
public class MultipartFilter extends OncePerRequestFilter {
/**
* The default name for the multipart resolver bean.
*/
public static final String DEFAULT_MULTIPART_RESOLVER_BEAN_NAME = "filterMultipartResolver";
private final MultipartResolver defaultMultipartResolver = new StandardServletMultipartResolver();
private String multipartResolverBeanName = DEFAULT_MULTIPART_RESOLVER_BEAN_NAME;
private final MultipartResolver defaultMultipartResolver 이게 빈으로 등록된다면 사용가능하겠지.
스프링 시큐리티는 30개정도의 필터를 가지고 있다. 이것을 모두 필터체인에 설치한다면? 필터체인은 상위에 등록되어있기때문에 상위 컨테이너만 사용할 수 있다. 그러므로 컨테이너반쪽만 사용가능하다는 것. 사실 보안처리는 모든 영역에 다 필요하다 그렇다면 상위영역에 등록되어야한다. 그래서 시큐리티는 프록시개념을 사용한다. 30개의 필터가 필터체인에 있어야하지만 그것을 상위컨테이너에 등록하고 요청이 들어오면 걸러내는 작업은 필터프록시를 설치하여 가짜가 요청을 잡고 필터링 작업은 진짜 필터체인들에게 요청을 넘겨버린다. 그러면 상위에 등록된 30개의 필터인 스프링시큐리티가 요청을 처리한다.
1.db없이 시큐리티 동작확인하고
2. db연결해보기
내일은 04번 프로젝트에 적용해보기
SpringSecurity_4_x.pdf
1.요청발생
2. 보호자원인지 판단
3. 인증여부 판단>로그인되어있는지
4. 로그인되어있어서 통과했다면 autorization 가자. >> 등급에 따라 접근을 허가할지말지 결정
5.결과
ㅣ자주 사용하는 시큐리티
로그인/로그아웃컨트롤러 시큐리티가 해준다.
Spring.io사이트
spring-security-core > spring-security-crypto
crypto : 암호화
java crypto api :
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${org.springframework.security-version}</version>
</dependency>
taglib : 태그를 이용해서 사용할 수 있다.
위임한다. : delegating한다.
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>springSecurityFilterChain</param-value>
</init-param>
</filter>
.DelegatingFilterProxy : 상위에 등록된 30개의 시큐리티를 사용하기위한 필터에 등록할 프록시
web.xml에 들어가보면
등록하고 리스너로 듣고있었다.
필터는 이미 2개 등록되어있음
시큐리티도 언어는 필요하니까
언어다음, 그리고
큐알로 인증할수도 있으니까
멀티파트다음에 입력
이 프록시는 진짜 필터를 찾아야한다. 그러려면 수만은 클래스중에 검색할 수 있는 조건을 주어야한다.>>BeanIds
이것을 필터네임으로
시큐리티는 모든 요청을 대상으로해야하기에 url-pattern에서 모든 파일을 해야한다. >> " /* "
보호자원과 그렇지 않은 자원 식별하여 등록하는 구조가 필요하다.
1.의존성주입
2.프록시
3.상위컨테이너
1. Filter, XML, In memory 기반의 인증구조
2. Role 기반의 선택적 랜더링 : ex) 관리자에게는 관리자에 맞는 메뉴구조 랜더링, 커스텀 태그 사용
3. MVC 모든 레이어에서 인증 객체를 확보하는 방법
4. 데이터베이스 기반의 인증구조
5. 비밀번호 단방향 암호화
1. Filter, XML, In memory 기반의 인증구조
롤은 꼭 ROLE_의 프리픽스가 필요하다.
<!-- Authentication Manager :userName과 크리덴셜정보가지고 함.
-> 인증객체를 제공하는 AuthenticationProvider (AuthenticationserviceImpl역할)
-> UserDetailService (( UserDetail:Me mVO느낌 )memberdao역할)-->
<bean id="passwordEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder"></bean>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="a001" password="java" authorities="ROLE_USER"/>
<security:user name="a001" password="java" authorities="ROLE_ADMIN"/>
</security:user-service>
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
provider가 실제 암호화를 시킨다
<bean id="passwordEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder"></bean>
<security:password-encoder ref="passwordEncoder"/>
비밀번호가 평문이다. > 인코딩이 필요하다 > 인코딩 도구를 빈으로 등록해두었다.
다음에 평문이 아닌 다른 형태로 하고 싶다면?
패스워드 인코더를 수정하고 ref를 바꾼다.
<security:http pattern="/resources/**" security="none" />
모든 정적자원에대해 시큐리티 대상(보호자원대상)을 적용하지 않겠다.
<security:intercept-url/> : 이 조건에 대한 요청은 가로채겠다.*원래는 필터가 하던일.
access=""인가정보 등록하
access="hasRole('ADMIN')" 표현언어, ROLE_ 생략함.
<!-- /login /logout --><!-- get방식이면 로그인폼 post방식이면 -->
security:authentication : 인증객체 불러올 수 있다.
<security:authorize> : if문
모델레이어는 웹에 종속되지 않아 세션이나 리퀘스트 쓰지 않았다.
그대신 리퀘스트는 스레드를 기반으로 인증객체를 검색해주는 유틸리티가 있다. >> SecurityContextHolder