Java/Spring

SPRING SECURITY 보안프레임워크

amungstudy 2023. 8. 25. 10:50

MAVEN 라이브러리 추가

pom.xml

<properties>
        <java-version>11</java-version>
        <org.springframework-version>5.3.29</org.springframework-version>
        <security-version>5.8.6</security-version>
        <org.aspectj-version>1.9.19</org.aspectj-version>
        <org.slf4j-version>2.0.7</org.slf4j-version>
    </properties>
<!-- SECURITY -->
        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>${security-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${security-version}</version>
        </dependency>        
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${security-version}</version>
        </dependency>

core,web,config 다 있어야 함.

web.xml

<!-- security filter -->
    <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>

security:http (springSecurityFilterChain 설정)

security 설정파일 생성(spring bean configuration file)
security-context.xml

여기서도 패턴 생성 가능함 (/*)


<!-- auto-config="true" 로그인페이지 / HTTP 기본인증 / 로그아웃 기능 제공 -->
<security:http auto-config="true">
    <!-- /test/master 요청이 들어온 사용자는 ROLE_ADMIN 권한을 가진 사용자만 접근 가능 -->
    <security:intercept-url pattern="/test/master" access="hasRole('ROLE_ADMIN')"/>    
    <!-- hasAnyRole : 나열된 권한 중 하나 가지고 있으면 접근 가능 -->
    <security:intercept-url pattern="/test/member" access="hasAnyRole('ROLE_MEMBER','ROLE_ADMIN')"/>
    <security:intercept-url pattern="/test/all" access="permitAll"/>
</security:http>
<security:authentication-manager>
    <security:authentication-provider>
        <security:user-service>
        <!-- test 위해 임의로 사용자 정보 등록해줌, {noop} : 암호화를 사용하지 않겠다는 뜻(테스트용) -->
            <security:user name="master" password="{noop}master" authorities="ROLE_ADMIN"/>
            <security:user name="member" password="{noop}member" authorities="ROLE_MEMBER"/>
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>

web.xml에 설정파일 등록

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/root-context.xml
            /WEB-INF/spring/security-context.xml
        </param-value>
    </context-param>

security 적용된 프로젝트에서 모든 POST 방식 요청시 CSRF토큰 필요

테스트과정에서는

    <!-- csrf_token 검증 안하겠음 -->
    <security:csrf disabled="true"/>

로그인 페이지 연결해보기(auto-config 해제)

<security:http> <!-- auto-config="true" -->
.............
    <!-- 로그인 - 인증 정보 추가 -->
    <security:form-login login-page="/login" 
                         login-processing-url="/login"
                         username-parameter="u_id"
                         password-parameter="u_pw" />
       <!-- 자동로그인 쿠키설정, remember-me-cookie:등록되는 쿠키이름값 -->
    <security:remember-me     remember-me-cookie="userCookie"
                            remember-me-parameter="rememberMe" token-validity-seconds="2419200"/>

CSRF토큰 자동처리

<form>
..........................
<!-- 토큰 발급 시큐리티가 처리 -->
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

 

 

로그아웃도 form으로 처리해준다.(CSRF토큰 필요)