스프링 시큐리티
1. authentication filter의 역할을 대신하자
2. authorization filter의 역할을 대신하자
Model 받으면 req scope에 넣어놓고 가져감 - model attribute가 됨
인증인가를 servlet 필터와 aop를 기반함
보안 추가하기위해 고정되어있는 HM, HA, VR를 바꾸면 안 됨 - decorating filter pattern을 쓰자.
필터를 기반으로 한다.
1. optional
2. 보안 처리에 순서가 존재
AOP
1. annotation 기반의 선언적 프로그래밍. 어노테이션만 잘 쓰면 알아서 인가 처리해준다.
--------
패키지 컨씨컨브
- pom.xml artifactid
- web.xml
- 네비게이터 뷰 .settings- common.component
로그인로그아웃컨트롤러 지움 (security 방식으로 할 것임)
-------------
필터의 객체는 톰캣에 의해 생성되는데 그러면 거기서 @inject를 해도 주입이 안됨. cuz 서버인 톰캣이 라이프사이클을 관리하기때문에.
그래서 핸들러인터셉터가필요하다.근데 이것도 하위컨테이너에 의해 관리됨. 보안은 상위컨테이너에서부터 적용되야하는데말이죠.
DelegatingFilterProxy: 위임을 처리하는 가짜 필터
요청받으면 스프링컨테이너 안에 등록된 진짜 필터를 찾아서 그쪽으로 위임함. 그 아이디값은 filter-name을 통해 찾아낸다. 그래서 filter-name을 찾아내야하는 필터의 id값을 써준다.
필터와 서블릿 중 필터가 더 먼저 동작하니깐 이 필터를 상위 컨테이너에 bean으로 등록시켜야한다.
니가 선량한 유저다 라는걸 알기위해 16진수 토큰 만들어내 c-s 매번 주고받음 그래서 정상적 토큰이들어오면 정상유저임, 그 공격자가 위조하려면 session id말고도 csrf토큰도 위조해야함.근데 이 토큰은 계속 바뀌어서 위조가 불가능함
csrf 기반의 공격 defend 방법
우리는 그런 토큰 설정을 안해서 쟤가 우리가 공격자라고 생각한거임.
해결법
1. 하라는대로 토큰 주고받아 -그러면 우리가가진 모든 form 태그가 토큰 넘길수있게바뀌어야함
2. 공격 defend 설정을 빼야됨
그러면 로그인 성공 후 스프링은 어떤 이름으로 인증 객체(authmember) 만들고있는가?
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
근데 이번엔 in-Memory 방식 말고 DB를 써서 그 안의 데이터를 가져오고 싶다면?
MemberUserService 를 만들고 MemberVO에 UserDetails 추가하기
@Override //한 사람이 여러개의 Auth를 가질 수 있어서 컬렉션임. 근데 얘 interface라 객체 못 만드니까 얘 구현체를 찾아서 쓰좍.
public Collection<? extends GrantedAuthority> getAuthorities() {
return Collections.singletonList(new SimpleGrantedAuthority(mem_role));
}