Spring Security

w ho
8 min readJul 14, 2020

--

버전에 맞게 4개의 dependency를 pom.xml에 추가해야 사용할수 있다 .

Spring security에서는 servlet에서 제공하는 filter와
interceptor로 구성되어있다.

web.xml에서 springSecurityFilterChain을 적용해 준다.

스프링 시큐리티에서도 인증과 권한에 대한 구조

-Authenticaiton Manager라는 곳에서 인증을 담당
-ProviderManager라는 곳에서는 인증에 대한 처리를
AuthenticationProvider라는 타입의 객체를 이용하여 처리를 위임한다.

  • AuthenticaionProvider를
    직접 구현하는 방식 / 실제 처리를 담당하는 UserDetailsService를 구현하는 방식으로 나누어집니다.(대부분 UserDetailsService를 구현 )

security-context.xml을 추가한다.

Spring Bean Configuration File을 선택하고 xml파일을 만든다.

만들때 주의해야할 점은 securiy5버전에서는 namespace에서 securiy를 추가했을때 spring-security-5.0.xsd를 그림과 같이 5.0를 지워줘야한다.

security-context.xml에 intercept를 만들어 해당 경로와 접근권한을 설정
(/sample/member라는 경로는 ROLE_MEMBER 라는 권한이 있는 사용자만 들어갈수 있게 설정하였다.ROLE_MEMEBER = >ID가 MEMEBER PWD도 MEMEBER인 사용자로 설정하였다.)또한 spring 5부터는 반드시 패스워드에 대한 인코딩 처리인 PasswordEncoder의 지정이 필요하다 .
인코딩 처리 없이 진행하고 싶다면 {noop}를 사용한다.

<security:http>
<security:intercept-url pattern="/sample/all" access="permitAll"/>
<security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/><security:form-login/>
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="member" password="{noop}member" authorities="ROLE_MEMBER"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
처음 sample/member url로 접근하게 되면 로그인 화면이 만들지 않아도 뜬다. 그후 에 지정한 id : memeber와 pwd : member를 입력하게 되면 로그인이 성공한다.

접근 제한에 대한 오류처리 (security-context.xml에서 security:http에 security:access-denied-handler를 작성 )

<security:http><security:intercept-url pattern="/sample/all" access="permitAll"/><security:intercept-url pattern="/sample/member" access="hasRole('ROLE_MEMBER')"/><security:form-login/><security:access-denied-handler error-page="/accessError"/></security:http>...

로그인 페이지를 직접 구현하여 적용할수도 있다 .

<!--   <security:form-login/>--> 
<!-- spring security에서 제공하는 login 기본 페이지 -->
<security:form-login login-page="/customLogin"/>
<!-- 직접 지정 가능 -->

customLogin에 대한 컨트롤러 지정

@GetMapping("/customLogin")public void loginInput(String error, String logout, Model model){if(error!=null){model.addAttribute("error","login error has account");}if(logout!=null){model.addAttribute("logout","Logout!!");}}

customLogin 화면 구현

<form action="/login" method="post"><div><input type="text" name="username" value="admin"></div><div><input type="password" name="password" value="admin"></div><div><input type="submit"></div><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"></form>

CSRF : Cross-site request forgery의 약자로 타사이트에서 본인의 사이트로 form 데이터를 사용하여 공격하려고 할 때, 그걸 방지하기 위해 csrf 토큰 값을 사용하는 것이다.

기본적으로 form 태그에 대한 규칙이며 post 형식의 /login으로 전송해야한다. 필요에 따라서 input name값은 변경 할수 있으나 기본값은 username과 password이다,
<security:http>
<!-- <security:form-login
username-parameter="loginId"password-parameter="loginPwd"login-page="/customLogin"/> 직접 지정 가능 -->
</seucrity:http>

로그아웃 처리

security-context.xml 에서

<security:logout logout-url="/customLogout" invalidate-session="true" logout-success-url="/sample/chat"/>

logout에 대한 코드를 작성한다. 해당 logout이 발생하면 /customLogout이 발생 했을시 진행되고 성공시 /sample/chat으로 넘겨 다시 로그인 을 하도록 지정

controller

@GetMapping("/customLogout")public void logoutGET() {log.info("custom logout");}

해당되는 jsp 에서 로그아웃이 진행되면 url을 /customLogout으로 넘기면 적용이 된다. (이때 로그인과 마찬가지로 csrf 토큰 방식도 같이 로그아웃 처리한다. )

<form action="/customLogout" method="post"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"><input type="submit" id="exit" value="퇴장" /></form>

--

--

No responses yet