| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- jsp
- 오류
- 티스토리 블로그
- Oracle
- ORA-01407
- 백준문제풀이
- ORA-02292
- 오라클
- 공부
- 전화번호부
- while
- 백준문제
- 이클립스단축기
- for문
- spring
- 인터페이스
- 자바
- 오류모음
- 스프링
- 파워서플라이
- MSI
- 백준
- 무결성 제약조건
- 이클립스
- 설정
- Ajax
- 깃허브 블로그
- 별 찍기
- 환경설정
- 순환문
- Today
- Total
danDevlog
Spring - 18 (스프링 시큐리티) 본문
로그인 처리 기능을 위해 스프링 시큐리티를 사용한다.
현재의 게시판은 아무나 아무글을 게시하고, 수정, 삭제가 가능하다.
이것을 계정과 사용자 권한에 따라서 제한하도록 할려고한다.
pom.xml에 시큐리티와 관련된 의존성을 4개 추가한다.
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.5.2</version>
</dependency>
WEB-INF/spring 폴더 아래에 security-context.xml을 생성한다.
해당 폴더에 우클릭 -> spring bean configuration file 로 파일을 만들어준다.

security-context.xml 에서 namespaces 탭 선택 -> security를 선택해준다.

spring-security.~~~.xsd 라고 적힌 부분이있는데 버전을 삭제해주고, 코드를 추가해준다.
<?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:form-login login-page="/customLogin"/>
</security:http>
<security:authentication-manager>
</security:authentication-manager>
</beans>
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>
로그인 여부를 체크해야한다.
웹의 기본은 요청과 응답의 한 사이클로 처리가 완료되기때문에, 세션에서 다음 페이지로 이동시
로그인 상태인지 확인해야 한다. 로그인이 된다면 세션에 사용자 정보를 저장하고,
페이지 이동시 사용자 정보를 확인하여 로그인 상태 처리한다. 로그인 정보가 없다면 로그인 창으로 이동
시큐리티를 적용하므로 post 방식의 전송마다 숨김값으로 csrf 추가
csrf : 사이트 간 요청 위조(또는 크로스 사이트 요청 위조, 영어: Cross-site request forgery, CSRF, XSRF) 는
웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.
서버에서는 추가적으로 csrf토큰을 확인하므로, 악의적인 공격을 차단한다.
register.jsp
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">글쓰기</h1>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-body">
<form role="form" action="/board/register" method="post">
<input type="hidden" name="${_csrf.parameterName }"
value="${_csrf.token }"/>
<div class="form-group">
<label>제목</label> <input class="form-control" name='title'>
</div>
<div class="form-group">
<label>내용</label>
<textarea class="form-control" row="3" name='content'></textarea>
</div>
<div class="form-group">
<label>작성자</label> <input class="form-control" name="writer">
</div>
<button type="submit" class="btn btn-default">전송</button>
<button type="reset" class="btn btn-default">취소</button>
</form>
</div>
</div>
</div>
</div>
csrf토큰을 추가하였다.
post전송에서는 csrf를 전달하지 않으면 시큐리티는 403에러를 발생시킨다.
계정 확인을 처리할 CommonController를 추가한다.
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.extern.log4j.Log4j;
@Controller
@Log4j
public class CommonController {
@GetMapping("/customLogin")
public void loginInput(String error, String logout, Model model) {
if(error != null)
model.addAttribute("error","계정을 확인해 주세요");
if(logout != null)
model.addAttribute("logout","로그아웃");
}
}
로그인 시 보여줄 로그인창을 구현한다. views 아래에 customLogin.jsp를 생성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- jstl core 쓸때 태그로 c로 표시 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!-- jstl fmt 쓸때 위와 같음, fmt : fomatter 형식 맞춰서 표시 -->
<%@ include file="includes/header.jsp"%>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<h1>로그인 처리</h1>
<h2>${error }</h2>
<h2>${logout }</h2>
<form method="post" action="/login">
<div class="form-group">
<input type="text" name="username" placeholder="userid" class="form-control">
</div>
<div class="form-group">
<input type="password" name="password" placeholder="password" class="form-control">
</div>
<div class="form-group">
<input type="checkBox" name="remember-me">자동 로그인
</div>
<div class="form-group">
<input type="submit" value="login">
</div>
<input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }"/>
</form>
</div>
</div>
</div>
<%@ include file="includes/footer.jsp"%>
customLogout.jsp (login에서 조금만 수정함)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- jstl core 쓸때 태그로 c로 표시 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!-- jstl fmt 쓸때 위와 같음, fmt : fomatter 형식 맞춰서 표시 -->
<%@ include file="includes/header.jsp"%>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<h1>로그아웃 처리</h1>
<h2>${error }</h2>
<h2>${logout }</h2>
<div class="panel-body">
<form role="form" method="post" action="/customLogout">
<fieldset>
<!-- 관련 요소들 묶는 역할 -->
<a href="index.html" class="btn btn-lg btn-success btn-block">
로그아웃
</a>
</fieldset>
<input type="hidden" name="${_csrf.parameterName }"
value="${_csrf.token }">
</form>
<!-- 겟 방식으로 로그아웃 페이지에 접근하고, 로그아웃 버튼을 누르면 포스트 방식으로 처리 -->
</div>
</div>
</div>
</div>
<script>
$(".btn-success").on("click", function(e){
e.preventDefault();
$("form").submit();
});
</script>
<c:if test="${param.logout != null }">
<script>
$(document).ready(function(){
alert("로그아웃");
});
</script>
<!-- 로그아웃 파라미터 값이 있다면, 로그아웃 안내창 표시 -->
</c:if>
<%@ include file="includes/footer.jsp"%>
'Spring 게시판 만들기' 카테고리의 다른 글
| Spring - 20(스프링 시큐리티-3) (0) | 2022.05.08 |
|---|---|
| Spring - 19 (스프링 시큐리티 - 2) (0) | 2022.05.02 |
| Spring - 17 (첨부파일-3) (0) | 2022.04.29 |
| Spring - 16 (첨부파일 - 2) (0) | 2022.04.29 |
| Spring - 15 (첨부파일) (0) | 2022.04.26 |