문서의 이전 판입니다!
<global-method-security> <expression-handler ref="myMethodSecurityExpressionHandler"/> </global-method-security>
<!-- This must go before the http element in order to be used by security:authorize tags using the access attribute --> <bean id="expressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"> <property name="roleHierarchy" ref="roleHierarchy" /> <!-- 꼭 필요한지는 의문 --> </bean> <security:http auto-config="true" use-expressions="true" access-decision-manager-ref="accessDecisionManager"> ... </security:http> <!-- security:authorize tags using the url attribute will delegate to this accessDecisionManager --> <bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <property name="decisionVoters"> <list> <ref bean="webExpressionVoter" /> </list> </property> </bean> <bean id="webExpressionVoter" class="org.springframework.security.web.access.expression.WebExpressionVoter"> <property name="expressionHandler" ref="expressionHandler" /> </bean> <!-- 꼭 필요한지는 의문 --> <bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl"> <property name="hierarchy"> <value> ROLE_A > ROLE_B ROLE_B > ROLE_AUTHENTICATED ROLE_AUTHENTICATED > ROLE_UNAUTHENTICATED </value> </property> </bean>
403 Forbidden
페이지가 뜬다.<access-denied-handler ref="accessDeniedHandler 빈"/> <!-- 혹은 에러 처리 주소 지정 --> <access-denied-handler error-page="/accessDenied.do" />
SpringSecurity는 로그인 혹은 권한 관련예외가 발생할 경우 세션에 해당 예외를 저장한다. (SimpleUrlAuthenticationFailureHandler의 saveException() 참조)
문제는 기계화된 로그인 공격이 들어올 경우 모든 리퀘스트는 새로운 세션으로 간주되며 예외들이 모두 세션에 저장되어 메모리 고갈을 일으킨다는 점이다. 이 때문에 AuthenticationFailureHandler를 SimpleUrlAuthenticationFailureHandler를 상속하여 구현하면서 saveException()
을 호출하지 않도록 하는 것이 좋다.
해당 구현체를 다음과 같이 설정해 준다.
<form-login ... authentication-failure-handler-ref="AuthenticationFailureHandler구현체" />