본문 바로가기

STUDY/Spring

Spring | 스프링 시큐리티(Spring Security) (2) 로그인 구현

1. JSP파일 작성 및 컨트롤러 작성

 

views폴더 하위에 users라는 폴더를 생성한 후 amdin, login, member파일 생성.

  • admin - 관리자 권한이 있을 경우에만 접근가능 페이지
  • login - 직접 커스텀할 로그인 페이지
  • member - 멤버 권한(==로그인 한 일반 유저)이 있을 경우 접근 가능 페이지
  • home - 모두 접근 가능

 

 

UserController클래스를 작성해주었음.

@RequestMapping("/users")
@Controller
public class UserController {
	
	private static final Logger logger = LoggerFactory.getLogger(UserController.class);
	
	@GetMapping("/login")
	public void loginPage(String error, String logout, Model model) {
		logger.info("로그인 페이지로 이동~");
		logger.info("err :" + error );
		logger.info("logout : " + logout );
		if(error != null) { 
			model.addAttribute("error","로그인 실패"); 
		} 
		if(logout != null) { 
			model.addAttribute("logout","로그아웃"); 
		}
	}
	
	@PostMapping("/login-processing")
	public void loginProcessing(String error) {
		logger.info("login-processing!");
		logger.info("err :" + error );
	}
	
	@GetMapping("/member") 
	public void doMember() { 
		logger.info("멤버로그인~"); 
	} 
	
	@GetMapping("/admin") 
	public void doAdmin() { 
    		logger.info("관리자로그인~"); 
	}

}

 

 

2. 로그인 페이지 작성

 

method post지정 필수, action태그에 들어갈 값은 로그인 처리를 할 컨트롤러 url

일반적으로 생각하는 id가 username임  *변경하고 싶다면 security-context.xml에서 변경 가능

 

<!-- users/login.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>로그인 페이지 ㅎㅎ</h1>
	<h1>Login Page</h1> 
	<h2>${error}</h2> 
	<h2>${logout}</h2> 
	<form action="${pageContext.request.contextPath}/users/login-processing" method="post"> 
		<div> <input type="text" name="username" /> </div> 
		<div> <input type="password" name="password" /> </div> 
		<div> <input type="submit"/> </div> 
		<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
	</form>

</body>
</html>

 

 

CSRF(Cross-site request forgery)?

사이트간 위조방지 목적으로 사용하는 토큰. 인증과는 다름.

서버에서 값을 전송할 때 임의의 토큰 즉 csrf를 생성해 보내 신뢰할 수 있는 값인지 판단.

 

csrf비활성화는 security-context.xml에서 설정할 수 있음.

<security:csrf disabled="true" />

 

개발자모드로 보면 임의의 토큰 값이 설정되어있음을 확인할 수 있다.

 

+) 읽어보기

 

[Spring Security] csrf

스프링 시큐리티를 적용하면, 별다른 설정을 하지 않더라도 기본적으로 csrf라는 기능이 활성화되어 있다.Cross-site request forgery의 약자로 타사이트에서 본인의 사이트로 form 데이터를 사용하여 공

velog.io

 

 

 

 

3. spring-security.xml 작성

 

이전에 최소한만 작성했던 파일을 전격 수정..

 

  • pattern - 컨트롤러 url작성
  • access - 접근 권한 설정
  • login-page - 위에서 작성한 로그인 페이지 등록
  • login-processing-url - 위에서 작성한 로그인 form의 action값. 컨트롤러 url
  • security:user - 로그인 테스트를 진행하기 위해 임의로 등록한 유저들
  • password - {noop}를 붙여야 함 (비밀번호 암호화 해제)
  • authorities - 권한부여. 하나 이상의 권한 부여하기 가능

 

전체 코드

더보기

spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<security:http>
		<security:intercept-url pattern="/" access="permitAll"/>
		<security:intercept-url pattern="/users/member" access="hasRole('ROLE_MEMBER')"/>
		<security:intercept-url pattern="/users/admin" access="hasRole('ROLE_ADMIN')"/>
		<security:form-login login-page="/users/login"
							 login-processing-url="/users/login-processing" />
	</security:http>
	
	<security:authentication-manager>	
		<security:authentication-provider>
			<security:user-service>
				<security:user name="aaa" password="{noop}aaa" authorities="ROLE_MEMBER"/>
				<security:user name="admin" password="{noop}admin" authorities="ROLE_MEMBER, ROLE_ADMIN"/>
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>

</beans>

 

 

 

4. 로그인 해보기

 

ROLE_MEMBER 로그인

users/member.jsp은 접근 가능하나 users/admin.jsp는 접근 불가

 

ROLE_ADMIN로그인(ROLE_MEMBER권한도 가지고 있는 계정)

모두 접근 가능