기본 콘텐츠로 건너뛰기

Spring Security 설정 완벽 가이드 — web.xml + security-context.xml 예제 총정리

Spring Security 설정 완벽 가이드 — web.xml + security-context.xml 예제 총정리

Spring Security 설정 완벽 가이드 — web.xml + security-context.xml 예제 총정리

Spring Security는 Java 웹 애플리케이션에서 인증(Authentication)과 인가(Authorization)을 처리하는 강력한 프레임워크입니다.
이번 포스팅에서는 web.xml의 필터 등록부터 security-context.xml의 구체적인 설정까지, 예제 코드와 함께 하나씩 살펴보겠습니다.


1️⃣ web.xml에 Spring Security 필터 등록

Spring Security를 사용하려면, 먼저 DelegatingFilterProxyweb.xml에 등록해야 합니다. 이 필터는 Spring 컨테이너에서 관리되는 springSecurityFilterChain을 서블릿 필터 체인에 연결하는 역할을 합니다.


<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>

위 설정을 통해 모든 요청(/*)이 Spring Security 필터 체인을 거치게 됩니다.


2️⃣ security-context.xml 설정

다음은 Spring Security의 주요 설정을 담은 security-context.xml 예제입니다.
정적 리소스는 보안 필터를 거치지 않도록 하고, 로그인/로그아웃, 세션 관리, 접근제어를 포함합니다.


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:security="http://www.springframework.org/schema/security" 
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.2.xsd">
                        
    <!-- 정적 리소스는 보안 필터 적용 제외 -->
    <security:http pattern="/resources/**" security="none"/>
    <security:http pattern="/images/**" security="none"/>
    <security:http pattern="/font/**" security="none"/>
    <security:http pattern="/js/**" security="none"/>
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/**.jsp" security="none"/>

    <!-- 로그인/로그아웃 및 인증 설정 -->
    <security:http pattern="/**" auto-config="true" use-expressions="true"
                   authentication-manager-ref="userProvider">

        <security:form-login 
            login-page="/login.do"
            username-parameter="mbrId"
            password-parameter="mbrPwd"
            authentication-failure-url="/login.do"
            login-processing-url="/loginProc.do"
            default-target-url="/login.do"
            always-use-default-target="true"
            authentication-success-handler-ref="loginSuccessHandler"
            authentication-failure-handler-ref="loginFailureHandler"/>
        
        <security:logout 
            logout-url="/logout.do"
            delete-cookies="JSESSIONID"
            success-handler-ref="logoutHandler"/>
        
        <security:session-management>
            <security:concurrency-control 
                max-sessions="100" 
                expired-url="/login_duplicate"
                error-if-maximum-exceeded="false"/>             
        </security:session-management>
        
        <security:access-denied-handler ref="accessDeniedHandler"/>
    </security:http>

    <!-- 로그인/로그아웃/예외처리 핸들러 정의 -->
    <bean id="logoutHandler" class="com.cmmn.security.logoutHandler"/>
    
    <bean id="accessDeniedHandler" class="com.cmmn.security.CustomAccessDeniedHandler">
        <property name="errorPage" value="/accessDenied"/>
    </bean>

    <bean id="loginSuccessHandler" class="com.cmmn.security.LoginSuccessHandler"/>
    <bean id="loginFailureHandler" class="com.cmmn.security.LoginFailureHandler"/>
    <bean id="adminLoginFailureHandler" class="com.cmmn.security.AdminLoginFailureHandler"/>

    <!-- 사용자 인증 Provider 등록 -->
    <bean id="customAuthenticationProvider" class="com.cmmn.security.CustomAuthenticationProvider"/>
    
    <security:authentication-manager id="userProvider" alias="userProvider">     
        <security:authentication-provider ref="customAuthenticationProvider"/>          
    </security:authentication-manager>  

</beans>

3️⃣ 주요 설정 요약

  • Filter 등록: DelegatingFilterProxy로 Spring Security 필터 체인 연결
  • 정적 리소스 제외: JS, CSS, 이미지 등은 보안 필터 제외
  • form-login: 로그인 페이지, 파라미터 이름, 성공/실패 핸들러 지정
  • logout: 로그아웃 URL 및 쿠키 삭제 설정
  • session-management: 동시 접속자 제한 및 중복 로그인 처리
  • access-denied-handler: 접근 거부 시 이동할 페이지 지정
  • authentication-manager: 사용자 정의 인증 Provider 등록

✅ 정리

이 설정을 통해 Spring Security는 모든 요청을 필터 체인에서 제어하며, 로그인, 로그아웃, 세션 제어, 접근 권한 처리를 통합적으로 관리합니다.
각 기능별 핸들러를 커스터마이징하면 로그인 성공/실패 로직이나 접근제어 로직을 세밀하게 제어할 수 있습니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...