<Spring Web Security>
<인증(Authentication)과 권한부여(Authorization - 인가)>
1. 인증
- 자신을 증명하는 것
- 자기 스스로가 무언가 자신을 증명할 만한 자료를 제시 (비밀번호)
2. 인가 (역할)
- 남에 의해서 자격이 부여됨
3. AuthenticationManager(인증 매니저)
- 인증 담당하며, 다양한 방식의 인증을 처리
4. ProviderManager
- 인증에 대한 처리를 AutheticationProvider라는 타입의 객첼ㄹ 이용해 처리
5. AuthenticationProvider(인증 제공자)
- 실제 인증 작업을 진행
- UserDetailService가 인증 정보에 관한에 대한 정보를 구성
---중간에 뭐 있는데 이따가 쓰자---
<접근 제한 설정>
‼️ 403에러 : 권한부족
- 에러 발생보다는 로그인 페이지로 리다이렉트 --> 로그인 설정
1. CSRF(Cross Site Request Forgery) 공격
- 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격
- POST 요청을 위조하여 전송하는 것
- 방어책
* CSRF 토큰 운영
** form 페이지 GET 요청시 form 내에 인증 토큰을 심어서 전송시
** 인증 토큰이 있는 경우에만 정당한 POST 요청으로 인식
** 해당 토큰이 없으면 에러를 발생시킴
- spring-security 사용시 디폴트로 사용하는 것으로 설정됨.
post delete, login -> session : browser 식별 (jsession ID가 있는지) -> jsession이 있다면 로그인한 사용자 판별 가능함.
form에 hidden으로 값을 넣어줌.
2. 접근 권한 설정 페이지 접근시
- 권한이 맞으면 요청한 페이지로 진입
- 권한이 맞지 않으면
* 로그인 하지 않은 경우 login 페이지로 이동 -> 로그인 이후 해당 페이지로 들어감
* 로그인 된 상태라면 403 에러 발생
3. 로그아웃 설정
- 로그아웃 시 해야 할 일
* 세션 무효화(invalidate)
* 쿠키 제거 : JSESSION-ID remember-me
* logout url을 post로 요청
<JSP에서 로그인 한 사용자 정보 보여주기>
1. spring security tag lib 사용
<%@ taglib uri="http://www.springframework.org/security/tags"
prefix="sec" %>
2. <sec:authentication>
- <sec:authentication property="principal"> // principal : 본인(주체)
* principal : UserDetailsService가 리턴한 객체 --> loadUserByUsername()에서 반환한 User 객체
* 로그인 사용자명 출력
<sec:authentication property="principal.username"/>
3. <sec:authorize access="">
- isAnonymous() : 로그인을 하지 않은 경우 true
- isAuthenticated() : 로그인을 한 경우 true
4. MemberMapper.xml에 추가해주기.
<id property="username" column="username" /> -> column이 username인 것은 하나로만 처리해라 라는 의미.
그리고 이게 가장 중요함
<collection property="authList" resultMap="authMap" />
MemberVO.java에서 리스트로 처리해주는 부분
private List<AuthVO> authList; <- 다른 테이블에 대한 정보
를 authMap으로 resultMap에 넣어달라는 의미
collection - 리스트 처리하라는 의미.
property - 리스트 변수명.
resultMap -> 맵핑 규칭 -> authMap
username과 auth를 만들어라.
<username> <auth>
admin ROLE_ADMIN
admin ROLE_MANAGER
admin ROLE_USER
list에 3개가 담김.
==> AuthVO로 만들어짐.
원래 보안이 실제 서비스를 만들 때 가장 먼저 이뤄져야 할 부분임.