ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security
    Java/Spring 2018. 9. 11. 16:24
    반응형

    Spring Security


    보안에 있어서 가장 중요한 개념은 “인증(Authentication)”과 “권한부여(Authorization)”이라 할 수 있다.


    인증(Authentication)이란 애플리케이션의 사용자가 해당 사용자가 주장하는 본인이 맞는지 확인하는 절차로써 아래와 같은 방법을 사용할 수 있다.


     - 크리덴셜 기반 인증 : 사용자명과 비밀번호를 이용한 방식

     - 이중 인증 : ATM기기를 이용할 떄처럼 물리적인 카드와 사용자가 입력한  개인정보를 조합하는 방식 -> OTP, 핸드폰 본인인증

     - 하드웨어 인증 : 자동차 키와 같은 방식



    권한부여(Authorization)란 인증을 통해서 인증된 주체를 하나 이상의 권한에 매핑해, 보호된 리소스에 대한 권한을 체크하는 것을 말한다.


     - 인증이 되었더라도 리소스에 대한 권한이 없다면 애플리케이션을 이용할 수 없다.



    Spring Framework 기반의 애플리케이션이라면 Spring Security를 이용해 인증과 권한부여를 쉽고 안전하게 구현할 수 있다.


    Filter 기반으로 동작해 Spring MVC의 구현과 완전히 분리되어 관리할 수 있다. - 애플리케이션에서 관리를 안하고 앞단에서 필터 기능을 함


    권한 기반의 허가를 지원하므로 경로별, 권한별 리소스 제한에 대해서도 많은 기능을 적용할 수 있음.



    pom.xml에 spring-security-web, spring-security-config dependency를 추가한다.


    web.xml에  <!-- 스프링 세션  리스너 등록 -->

        <listener>

            <listener-class>

                 org.springframework.security.web.session.HttpSessionEventPublisher

            </listener-class>

        </listener>

        

        <!-- 스프링 보안 필터 -->

        <filter>

            <filter-name>springSecurityFilterChain</filter-name>

            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

        </filter>  

        <filter-mapping>

            <filter-name>springSecurityFilterChain</filter-name>

            <url-pattern>/*</url-pattern>

        </filter-mapping> 를 추가한다.


    org.springframework.security.web.session.HttpSessionEventPublisher

    사용자가 다른 브라우저로 동시 로그인을 하지 못하도록 막는 리스너.


    org.springframework.web.filter.DelegatingFilterProxy

    Web으로 들어오는 요청에 대해 Spring Security가 관여하도록 만들어주는 프록시 필터

    인증이나 권한에 대해 체크해준다.


    spring 폴더에 securityContext.xml을 만들고 없다면 dispatcherServletContext.xml을 이용하고

    NameSpace에 security를 추가한다. STS에서는 Namespace를 바로 이용 가능하지만 Eclipse에서 사용하려면 STS Tool을 다운해야 한다.


    securityContext.xml





    xmlns:security="http://www.springframework.org/schema/security"를 

    xmlns:s="http://www.springframework.org/schema/security" 로 바꿨서 <s:로 사용한다.


    <s:http>

    <!-- URL별 접근 권한 설정 -->

    <s:intercept-url pattern="/resources/**" access="permitAll" />

    <s:intercept-url pattern="/" access="permitAll" />

    <s:intercept-url pattern="/memberlogin" access="permitAll" />

    <s:intercept-url pattern="/member/login" access="permitAll" />

    <s:intercept-url pattern="/member/regist" access="permitAll" />

    <s:intercept-url pattern="/member" access="hasRole(USER)" />

    <s:intercept-url pattern="/member/**" access="hasRole(USER)" />

    <s:intercept-url pattern="/board/**" access="hasRole(USER)" />

    <!-- CSRF 비활성화 -->

    <s:csrf disabled="true" />

    <!-- Security Login 처리 -->

    <s:form-login 

    login-page="/"

    username-parameter="id"

    password-parameter="password"

    login-processing-url="/memberlogin"

    default-target-url="/member/login"

    authentication-failure-url="/"

    always-use-default-target="true"

    />

    <!-- Security Logout 처리 -->

    <s:logout

    logout-url="/memberlogout"

    logout-success-url="/"

    invalidate-session="true"

    />

    <!-- 중복 로그인 제어 -->

    <!-- 

    invalid-session-url= session이 파괴되면 이동할 url

    concurrency-control : 동시성 제어

    expired-url : 튕겨지고 나올 url

    먼저 접속되있는 브라우저가 튕긴다.

    -->

    <s:session-management invalid-session-url="/">

    <s:concurrency-control 

    max-sessions="1"

    expired-url="/"

    />

    </s:session-management>

    </s:http>

    <!-- Spring Security가 처리할 인증 객체 생성 -->

    <bean id="userService"

      class="kr.co.hucloud.security.UserService">

    <property name="memberService" ref="memberService" ></property>

    </bean>

    <!-- userService 객체를 Spring security authentication-manager에 등록 -->

    <s:authentication-manager>

    <s:authentication-provider ref="userService" />

    </s:authentication-manager>



    4.3 이하 버전이면 pom.xml에 있는 버전을 4.0.0으로 맞춘다.






    securityContext.xml

    <sec:intercept-url pattern=“url" access=“ROLE" />

    permitAll : 모든 사용자의 접근을 허가한다.

    사용 예) access="permitAll"


    denyAll : 모든 사용자의 접근을 거부한다.

    사용 예) access="denyAll" 


    anonymous : 익명사용자에게 접근을 허가한다.

    사용 예) access="anonymous" 


    authenticated : 인증된 사용자에게만 접근을 허가한다.

    사용 예) access="authenticated" 


    rememberMe : Remember Me 기능으로 인증된 사용자에게만 접근을 허가한다.

    사용 예) access="rememberMe" 


    fullyAuthenticated : 완전한 크리덴셜로 인증된 사용자에게만 접근을 허가한다.

    사용 예) access="fullyAuthenticated"



    securityContext.xml

    <sec:csrf disabled="true" />

    Spring Security 4 부터 추가된 속성

    CSRF의 보안을 설정하기 위한 설정

    Spring Security 4부터 추가되었으며 true로 설정할 시 모든 페이지에 대해 token 값이 있어야만 한다.

    false 로 설정 할 시 csrf 방어를 하지 않는다.

    이 때는 개발자가 따로 개발해 두어야 함.



    securityContext.xml

    <sec:form-login … />

    Spring Security를 이용해 로그인할 설정

    속성

    login-page

    login 폼이 존재하는 페이지 URL

    username-parameter

    login 폼에서 ID의 파라미터 이름 (<input type=“text” name=“이것이 username-parameter” />

    password-parameter

    login 폼에서 Password의 파라미터 이름 (<input type=“password” name=“이것이 password-parameter” />

    login-processing-url

    Spring Security를 이용해 로그인을 처리할 URL 

    AuthenticationProvider의 구현체

    default-target-url

    로그인이 정상적으로 완료되면 이동할 Page URL

    authentication-failure-url

    로그인이 실패할 경우 이동할 Page URL

    always-use-default-target

    true로 지정하면 로그인이 성공했을 때 default-target-url로 무조건 이동한다.

    false로 지정하면 다른 페이지로 이동할 수 있도록 한다.

    이때는 default-target-url 이 아닌 authentication-success-hanlder를 이용해야 한다.



    securityContext.xml

    <sec:logout logout-success-url="/" logout-url="/member/logout2" invalidate-session="true"/>

    로그아웃을 처리할 URL 설정

    logout-success-url

    로그아웃이 성공하면 이동할 Page URL

    logout-url

    로그아웃을 처리할 URL

    직접 페이지를 만들 필요 없다.

    Spring Security가 알아서 Logout 처리를 함

    invalidate-session

    로그아웃을 할 때 세션을 삭제할 것인지 여부



    securityContext.xml

    <sec:session-management invalid-session-url="/">

        <sec:concurrency-control max-sessions="1" expired-url="/" />

    </sec:session-management>

    invalid-session-url

    세션 타임아웃으로 인해 세션이 끊어졌을 때 이동할 페이지

    max-sessions

    최대 허용 가능 세션 수

    expired-url

    중복 로그인이 일어날 경우 이동할 주소

    만약 중복 로그인이 일어날 경우 처음 접속한 Session은 Invalidate가 되고 다음 요청시 invalid-session-url로 이동한다.

    처음 접속한 Session은 그대로 두고 두 번째 접속한 Session의 로그인을 거부하고 싶다면

    expired-url 대신 error-if-maximum-exceeded 를 true로 지정한다.




    securityContext.xml

     <bean id="userService" class="kr.co.hucloud.security.UserService">

         <property name="memberDAO" ref="memberDAO" />

    </bean>

    form-login 의 login-processing-url로 로그인 요청이 들어올 경우 인증을 처리한다.

    AuthenticationProvider 인터페이스의 구현체가 처리한다.


    <sec:authentication-manager>

        <sec:authentication-provider ref="userService"/>

    </sec:authentication-manager> invalid-session-url

    로그인 처리 클래스를 인증관리자에 등록한다.




    반응형

    댓글

Designed by Tistory.