[Spring Security의 핵심구조]
1. AuthenticationManager 는 다양한 방식의 AuthenticationProvider를 이용해서 사용자 정보를 확인
Spring Security 핵심구조
[로그인과 로그아웃 처리]
1. [Security가 필요한 설계] 를 이어서, security-context.xml에 접근제한설정을 하겠습니다.
1) access="" 로 접근제한 설정을 합니다. all 은 permitAll, hasRole은 신분증 개념으로 생각하시면 됩니다.
Spring Security - 경로에 따른 접근 권한 설정
스프링 시큐리티에서는 권한에 따라 접근 가능한 경로를 제한할 수 있다. 그럼 권한에 따라 다른 링크를 보여준다면, 접근 가능한 경로를 제한할 수 있는 것 아닌가? 라는 생각을 할 수도 있다. 맞다. 눈에 보..
to-dy.tistory.com
security-context.xml 접근제한설정
결과확인,
localhost:8080/security/all 은 누구나 접근할 수 있으므로
해당 페이지 내용이 뜨지만,
localhost:8080/security/member 를 검색했을 때는
member가 아니므로 접근할 수 없습니다.
[단순 로그인 처리]
1.단순한 문자열로 권한을 지정할 수 있지만 5버전 이상에서는 반드시 PasswordEncoder 작업이 필요하므로 주의
1) {noop}을 이용해서 임시로 처리 가능 (내부적으로 암호화)
2) security-context.xml 에 id 가 member, password 가 member, 권한은 ROLE_MEMBER 인
계정을 추가합니다.
security-context.xml
id=member / pw=member 로 입력하면 로그인이 됩니다.
※ 로그인 폼을 만들지 않았는데, 어떻게 로그인 폼이 나오나요?
<security:form-login/> 때문입니다. Spring Security에서 제공하는 로그인 폼을 사용하도록 설정한 것입니다.
※ 로그아웃을 할 때는, F12 키를 눌러 개발자 화면을 꺼내 Application 에서 Cookies 를 삭제하면 됩니다.
login을 하면 세션이 부여가 되는데, 그 세션을 가지고 member 가 login 되었다는 것을 인식하는 것이기 때문
logout 하는 법
[여러 권한을 가지는 사용자 설정]
1. security-context.xml 에 접근제한 설정을 하나 추가하고, admin 계정을 하나 추가합니다.
security-context.xml
member로 로그인 한 후 security/admin 일 때 접근제한(403)이 걸리는 것을 확인할 수 있습니다.
admin으로 로그인하면 security/admin에 접근이 가능합니다.
또한, admin은 ROLE_MEMBER 로 권한도 갖기 있기 때문에 security/member에도 접근이 가능합니다.
[접근 제한 메시지의 처리]
member 에서 권한이 없는 곳(security/admin)으로 접근하였을 때 403 에러가 났습니다.
이것을 AccessDeniedHandler를 구현하거나 URI를 지정해서 화면처리를 할 수 있도록 하겠습니다.
1. security-context.xml 에 URI 를 지정합니다.
security-context.xml
2. CommonController.java를 생성하여 /accessError URl를 처리할 수 있도록 합니다.
CommonController.java
3. 에러 화면을 보여주는 accessError.jsp 를 구성합니다.
accessError.jsp
결과확인
[AccessDeniedHandler 인터페이스를 구현하는 경우]
1. 접근 제한이 된 경우에 다양한 처리를 하고 싶을 때 사용합니다.
1) 쿠키나 세션에 특정한 작업을 하거나
2) HttpServletResponse에 특정한 헤더 정보를 추가할 때
2. org.zerock.security.CustomAccessDeniedHandler.java를 생성합니다.
CustomAccessDeniedHandler.java / AccessDeniedHandler 를 implements 하였습니다.
3. security-context.xml 를 다음과 같이 수정합니다.
security-context.xml , bean을 추가해주었고 errorpage를 ref로 id customAccessDenied 를 참조하도록 하였습니다.
결과확인
[커스텀 로그인 페이지]
기본으로 제공되는 로그인 페이지는 화면 디자인의 문제로 사용하기 불편합니다.
1. security-context.xml 에 from-login 의 url을 수정합니다.
security-context.xml
2. CommonController.java 에 customLogin URL을 처리하는 메소드를 생성합니다.
CommonConroller.java
3. 커스텀 로그인화면을 보여줄 customLogin.jsp 를 생성합니다.
1) <input> 의 name은 Spring Security 가 사용하는 userid 라고 생각하시면 됩니다.
(username 외 다른 용어 사용 불가, password 도 마찬가지)
2) Spring Security 에서 POST로 전송할 때는
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 를 사용해야합니다.
customLogin.jsp
결과확인
[CSRF(Cross-Site Request Forgery) 공격과 토큰
1. 사이트 간 요청 위조(Cross-site request forgery)공격 웹 기본적으로 출처를 따지지 않는다는 점을 이용
1) 웹 기본적으로 출처를 따지지 않는다는 점 이용
https://velog.io/@shroad1802/CSRF
CSRF
csrf란? > Cross-site request forgery, 사이트 간 요청 위조 사이트 간 요청 위조는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말한다. csrf의 예시
velog.io
2. Spring Security는 기본적으로 GET 방식을 제외하고 모든 요청에 CSRF 토큰을 사용합니다.
<form>등의 데이터 전송 시에 CSRF 토큰을 같이 전송하도록 처리합니다.
[로그인 성공과 AuthenticationSuccessHandler]
로그인 성공 후 특정 url 로 이동하거나 쿠키 처리 등의 추가적인 작업을 하기 위해 사용합니다.
1. CustomLoginSuccessHandler 클래스를 생성합니다.
1) 관리자면 관리자 화면으로, 회원이면 회원 페이지로, 그렇지 않으면 루트로 보내는 것입니다.
CustomLoginSuccessHandler.java else if 문에 return 을 넣어주세요.
2. security-context.xml 에 Handler bean을 추가하고 loginform 태그를 수정합니다.
security-context.xml
결과를 확인합니다.
로그인마다 서로 다르게 나와야 하는데
이미 응답된 commit 은 sendRedirect 할 수 없다고 해서 원인을 찾아보겠습니다.
찾았습니다. else if 에서 return; 을 안했습니다.
[로그아웃 처리와 LogoutSuccessHandler]
1. security-context.xml 에 로그아웃 태그를 추가합니다.
security-context.xml
2. CommonController.java 에 로그아웃 url 을 가져오는 메소드를 생성합니다.
CommomController.java
3. customLogout.jsp 를 생성합니다.
customLogout.jsp
4. admin.jsp 를 생성합니다.
admin.jsp views/security 안으로 넣어주세요.
Logout 링크가 나와야 하는데, 나오지가 않아서 원인을 찾아보겠습니다..
찾았습니다.. admin.jsp 는 views/security 에 있었는데 밖에 또 만들어서 이상한 곳을 가리키고 있었습니다.
admin.jsp 는 views/security 안에 넣으세요.
결과확인
결과확인 2
결과확인 3