본문 바로가기

개발(합니다)/Java&Spring

Spring Security 정리(1) : 로그인 화면

반응형

프로젝트를 진행하면서 작성한 내용을 순서대로 정리합니다.


1. pom.xml 작성

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>



2. web.xml 작성

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

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


url-pattern은 /*로 해줘야 합니다. 

접근하는 모든 URL을 시큐리티를 적용합니다.

/WEB-INF/spring/security-context.xml은 아래에서 생성합니다.


3. security-context.xml 생성 및 작성

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/member/**"
            access="hasAnyRole('ROLE_MEMBER','ROLE_ADMIN')" />
        <intercept-url pattern="/user/**"
            access="hasAnyRole('ROLE_USER','ROLE_MEMBER','ROLE_ADMIN')" />
        <intercept-url pattern="/admin/**"
            access="hasRole('ROLE_ADMIN')" />
        <intercept-url pattern="/**" access="permitAll" />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="user" password="{noop}password" authorities="ROLE_USER" />
                <user name="member" password="{noop}password" authorities="ROLE_MEMBER" />
                <user name="admin" password="{noop}password" authorities="ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>


<intercept-url> : 해당하는 pattern에 해당하는 url은 access에 해당하는 인증자만 접근 가능합니다.

/**는 모든 URL에 접근이 가능한 pattern입니다. 가장 아래에 있어야 합니다.
첫줄에 있으면 다른 pattern은 호출 되지 않습니다.


<user-service>에 있는 user는 id와 password와 authorities로 이루어져 있고 {noop}은 암호화를 하지 않았을 경우 넣어주는 식별자입니다.



SpEL 문법 : use-expressions=true를 해야지 사용 가능


표현식 

설명 

 hashRole('role1') 

 권한(role1)을 가지고 있는 경우 접근 가능

 hasAnyRole('role1', 'role2')

 권한들(role1, role2) 중 하나라도 가지고 있는 경우 접근  

 permitAll

 권한이 없어도 모든 곳에 접근 가능 

 denyAll 

 권한이 있어도 모든 곳에 접근 불가능 

 isAnonymouse()

 인증하지 않은 게스트 사용자 여부 

 isRememberMe()

 Remember-me 로그인 기능을 사용하는 사용자 여부

 isAuthenticated() 

 인증한 사용자 여부 

 isFullyAuthenticated()

 게스트 사용자도 아니고 Remember-me 사용하는 사용자도 아닌지 여부





        <form-login
        login-page="/login/login_form"
        login-processing-url="/j_spring_security_check"
        default-target-url="/"
        username-parameter="user_id"
        password-parameter="password"
        authentication-failure-url="/login?error=1"
        />
        
        <logout invalidate-session="true" logout-url="/j_spring_security_logout"
        logout-success-url="/" delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE" />
        
        <remember-me
        remember-me-parameter="remember-me"
        remember-me-cookie="remember-me"
        />

<csrf disabled="true"/>


<logout-url> /j_spring_security_logout은 스프링에서 제공하는 logout

<login-processing-url> /j_spring_security_check은 스프링에서 제공하는 login


<csrf disabled="true"> ssl을 사용하지 않으면 true로 사용


<form-login>

 표현식

 설명 

 username-parameter

 input 태크에서 name 속성 값 파싱   default : username

 password-parameter  

 input 태크에서 name 속성 값 파싱   default : password

 login-page

 커스텀한 login 페이지 URL            default : 스프링 제공 화면

 login-processing-url

 스프링에서 처리하는 URL            default : POST /login

 default-target-url 

 로그인 성공 시 호출 URL 

 authentication-failure-url 

 로그인 실패 시 호출 URL             default : /login?error=1 

 authentication-suceess-handler-ref

 로그인 성공 시 커스텀 핸들러로 리다이렉트 

 authentication-failure-handler-ref 

 로그인 실패 시 커스텀 핸드러로 리다이렉트 

 always-use-default-target 

 무조건 해당 핸들러로 이동          default : false 


4. 권한 별 로그인 

SecurityTestController.java

    @GetMapping("/page")
    public String page() {
        return "/security_test/page";
    }
    
    @GetMapping("/user/page")
    public String userPage() {
        return "/security_test/user/page";
    }
    
    @GetMapping("/member/page")
    public String memberPage() {
        return "/security_test/member/page";
    }
    
    @GetMapping("/admin/page")
    public String adminPage() {
        return "/security_test/admin/page";
    }



home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1>
    Hello world!
</h1>

<P> The time on the server is ${serverTime}. </P>


<a href='<c:url value="/page"/>'>GUEST</a>
<a href='<c:url value="/user/page"/>'>USER</a>
<a href='<c:url value="/member/page"/>'>MEMBER</a>
<a href='<c:url value="/admin/page"/>'>ADMIN</a>

</body>
</html>



위와 같이 페이지를 만들어줍니다.




5. 로그인 실행

spring에서 알아서 페이지를 만들어 줍니다.


비밀번호가 맞지 않으면 에러를 보여줍니다.




로그인에 성공한 화면입니다.


권한에 맞지 않는 경우에는 403 에러가 발생합니다.



반응형