[Spring-Framework] 18. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-Java) (3)
이전 글을 보지 않았다면, 꼭 진행해보고 오길 권장한다.
[이전 글]
1. [Spring-Framework] 16. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-Java) (1)
https://yyman.tistory.com/1422
2. [Spring-Framework] 17. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-Java) (2)
https://yyman.tistory.com/1423
22. View - home.jsp
사용자 인터페이스는 아래의 그림처럼 표현하였다.
그림 26. 로그인 전 - "/" 페이지
그림 27. 로그인 후 - "/" 페이지
그림 28. 로그인 후 - 권한별 기능 표시, 계정 정보 출력
그림 29. 로그인 후 - 권한별 기능 표시, 계정 정보 출력
경로: /src/main/webapp/WEB-INF/views/home.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page session="false" %>
<html>
<head>
<title>Spring-Security 5 (Java 방식)</title>
<meta charset="UTF-8">
<style>
body{
font-family:'Arial';
font-size:12px;
}
a{
text-decoration:none;
color:#666;
}
</style>
</head>
<body>
<h1>
Hello world!(Spring-Security 5(Java 방식)) - DB연동(Oracle)
</h1>
<hr />
<sec:authorize access="isAnonymous()">
<!-- 로그인 전 -->
<p>
<a href="<c:url value="/member/loginForm" />">로그인</a>
</p>
</sec:authorize>
<sec:authorize access="isAuthenticated()">
<!-- 로그인 성공 -->
<form:form action="${pageContext.request.contextPath}/logout" method="POST">
<input type="submit" value="로그아웃" />
</form:form>
<p>
<!-- 방법1. Sec 적용(이름 출력) -->
방법(sec 태그)1: <sec:authentication property="name" />
</p>
<p>
<!-- 방법2. c태그, Controller에서 가져오기 -->
방법(Model 정의)2: ${username}
</p>
</sec:authorize>
<h3>
<!-- 관리자 권한을 가진 경우만 보이기 -->
<sec:authorize access="hasRole('ROLE_ADMIN')" >
<a href="<c:url value="/admin/home" />">관리자 홈</a>
</sec:authorize>
<a href="<c:url value="/encode-password?password=pass" />">비밀번호</a>
</h3>
<!-- 비밀번호 생성기 -->
<c:set var="gene_pwd" value="${encode}" />
<c:if test="${gene_pwd != null}">
<c:out value="${gene_pwd}" />
</c:if>
</body>
</html>
파일명: home.jsp
[첨부(Attachments)]
home.zip
23. View - admin/home.jsp
관리자 페이지에 관한 것이다.
그림 30. 관리자 페이지
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>Admin - Page(관리자 - 페이지)</title>
<meta charset="UTF-8">
</head>
<body>
<h1>
Hello world!
</h1>
<P>
<h3>[<a href="<c:url value="/" />">홈으로(Home)</a>]</h3>
</P>
</body>
</html>
파일명: home.jsp
[첨부(Attachments)]
home.zip
24. View - member/loginForm.jsp
로그인 폼에 대한 사용자 인터페이스이다.
그림 31. 로그인 폼 - 로그인 전
그림 32. 로그인 폼 - 로그인 시도(아이디 또는 비밀번호 틀렸을 때)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>로그인 - 페이지(Login - Page)</title>
<style>
body{
font-family:'Arial';
font-size:12px;
}
a{
text-decoration:none;
color:#666;
}
</style>
</head>
<body>
<h1>아이디와 비밀번호를 입력해주세요.</h1>
<hr />
<c:url value="/member/loginForm" var="loginUrl" />
<form:form name="f" action="${loginUrl}" method="POST">
<p>
<label for="username">아이디</label>
<input type="text" id="id" name="id" />
</p>
<p>
<label for="password">비밀번호</label>
<input type="password" id="password" name="password"/>
</p>
<p>
<label for="remember-me">Remember-me(로그인 상태 유지)</label>
<input type="checkbox" id="remember-me" name="remember-me"/>
</p>
<%-- <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> --%>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button type="submit" class="btn">로그인</button>
<!-- 에러 메시지 영역 -->
<c:if test="${param.error != null}">
<p>아이디와 비밀번호가 잘못되었습니다.</p>
</c:if>
<c:if test="${param.logout != null}">
<p>로그아웃 하였습니다.</p>
</c:if>
</form:form>
<h3>[<a href="<c:url value="/" />">홈으로(Home)</a>]</h3>
</body>
</html>
파일명: loginForm.jsp
[첨부(Attachments)]
loginForm.zip
25. View - member/accessDenied.jsp
접근 제한 페이지에 관한 소스이다.
그림 33. 접근 제한된 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Access Denied</title>
</head>
<body>
<h1>Access Denied!</h1>
<h3>[<a href="<c:url value="/" />">홈</a>]</h3>
</body>
</html>
파일명: accessDenied.jsp
[첨부(Attachments)]
accessDenied.zip
26. 맺음글(Conclusion)
Spring Framework 5.4, Spring Security 5.4, Oracle 19g를 활용하여 보안 영역에 대해서 자세하게 살펴보았다.
* 참고 자료(References)
1. Hello Spring Security Java Config, https://docs.spring.io/spring-security/site/docs/5.0.16.RELEASE/guides/html5/helloworld-javaconfig.html#setting-up-the-sample, Accessed by 2020-09-27, Last Modified 2020-05-06.
추천(30점): 공식 사이트에서 제공하는 메뉴얼인데, 제작 흐름을 파악할 수 있다.
2. Tomcat ->Multiple Contexts have a path of 에러, https://kkangdda.tistory.com/12, Accessed by 2020-09-27, Last Modified 2019-11-06.
3. Spring Security 5 – Java Config, https://howtodoinjava.com/spring5/security/security-java-config-enablewebsecurity-example/, Accessed by 2020-09-27, Last Modified 2020-06-19.
추천(50점): June 19, 2020
- 1. @EnableWebSecurity is not found in any of the 3 jars.
= 2. "spring-security-config-5.0.7.RELEASE", "spring-security-core-5.0.7.RELEASE", "spring-security-web-5.0.7.RELEASE",
- June 19, 2020, Spring version is 5.2.5
4. Spring 4.0 + Java Config - web.xml 없애기..., https://tiveloper.tistory.com/entry/Spring-40-Java-Config-webxml-없애기, 2014-10-24
추천(20점): 조금 코드가 바뀐 부분이 있다.
public class WebInitializer implements WebApplicationInitializer { }
= 이 부분 클래스가 동작하지 않음. (변동 사항이 있었음.)
- 2013년 12월 정도에 Spring 4.0이 출시되었으니깐 오래되었다고 봐도 됨.
5.Spring Security : Web MVC + Security - Custom Login Form 만들기, https://kogle.tistory.com/78?category=870263, Accessed by 2020-09-27, Last Modified 2020-05-16.
추천(25점): 커스텀 로그인 페이지 java 버전에 대해서 간결하게 잘 작성되어 있음. (그러나 태스트를 해본 바로는 완벽하게 동작하진 않음.)
6. Spring Security Authentication Provider, https://www.baeldung.com/spring-security-authentication-provider, Accessed by 2020-09-27, Last Modified 2020-08-19.
추천(40점): 국내 자료에는 "CustomAuthenticationProvider()"에 대해서 자세히 잘 적어놓은 글을 찾기 힘들었음.
- shouldAuthenticateAgainstThirdPartySystem()가 동작되지는 않았지만, 많은 도움이 되었음.
6.Spring Security - 인증 절차 인터페이스 구현 (1) UserDetailsService, UserDetails, https://to-dy.tistory.com/86?category=720806, Accessed by 2020-09-27, Last Modified 2018.
추천(25점): 인증 절차(쉽게 소개하면, "DB처리에 대한 방법과 과정")에 대해서 잘 작성하였음.
- iBatis(MyBatis)로 작성되어 있긴 한데, 구현 원리를 살펴볼 수 있었음.
7.How to refer brcypt encoder to customized authentication provider?, https://stackoverflow.com/questions/35900053/how-to-refer-brcypt-encoder-to-customized-authentication-provider, Accessed by 2020-09-27, Last Modified 2016.
추천(13점): customized authentication provider에 대해서 구현 원리와 암호 처리 등에 대해서 소개하고 있다.
이 글에서 알 수 있었던 중요한 부분은 Spring Security 5.4로 구현하면서 암호가 랜덤으로 처리되는 것을 확인하였는데, 암호 확인하는 방법을 찾던 도중에 Bcrypt 함수 내에 확인하는 함수가 있는 것을 알게 되었다.
8. [Spring/Security] 초보자가 이해하는 Spring Security, https://postitforhooney.tistory.com/entry/SpringSecurity-%EC%B4%88%EB%B3%B4%EC%9E%90%EA%B0%80-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-Spring-Security-%ED%8D%BC%EC%98%B4, Accessed by 2020-09-27, Last Modified 2017-03-31.
9. [SPRING SECURITY] 4.스프링 시큐리티 로그인 커스터마이징, https://debugdaldal.tistory.com/89, Accessed by 2020-09-27, Last Modified 2016.
추천(15점): 자바 기반으로 커스터마이징 구현하는 방법에 대해서 소개되어 있다.
10. Spring Security Custom AuthenticationProvider example, https://javaengine.tistory.com/entry/Spring-Security-Custom-AuthenticationProvider-example, Accessed by 2020-09-27, Last Modified 2017-02-06.
추천(20점): Spring Security with Java 프로젝트 환경설정만 잘 되어 있다면, 시도해봐도 괜찮은 글이다.
11. Spring Security Remember Me, https://www.baeldung.com/spring-security-remember-me, Accessed 2020-09-27, Last Modified 2020-08-15.
추천(15점): 로그인 유지 및 자동 로그인에 관한 자바 버전으로 구현하는 방법에 대해서 소개하고 있다.
쿠키 제거하고 몇 가지 간단한 사용방법만 소개하고 있다.
12. 6 Spring Security - Access Denied Handler(error page 처리), https://jungeunlee95.github.io/java/2019/07/18/6-Spring-Security-Access-Denied-Handler(errorpage-%EC%B2%98%EB%A6%AC)/, Accessed by 2020-09-27, Last Modified 2019-7-18.
-> 비고: 접근 제어 페이지에 대해서 소개하고 있음.
13. 3 Spring Security - Authorization(권한) 설정(ROLE), TagLib authorize 추가, https://jungeunlee95.github.io/java/2019/07/18/3-SpringSecurity-Authorization(%EA%B6%8C%ED%95%9C)-%EC%84%A4%EC%A0%95(ROLE),-TagLib-authorize-%EC%B6%94%EA%B0%80/, Accessed by 2020-09-27, Last Modified 2020-07-18.
-> 비고: 권한별 페이지 꾸리는 방법에 대해서 소개하고 있음.