[Spring-Framework] 15. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-XML) (3)
이번에 소개할 내용은 1, 2부에 이어서 "자동 로그인"과 "로그아웃 시 쿠키 삭제"에 대해서 소개하겠다.
1. [Spring-Framework] 13. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-XML) (1), 2020-09-26
https://yyman.tistory.com/1419
2. [Spring-Framework] 14. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-XML) (2), 2020-09-26
1. 결과(Result)
로그인 상태 유지에 관한 기술이다.
이 기능은 쉽게 말하면, "로그인 기억하기", "로그인 상태 유지"를 체크하면 일정 시간 동안 다시 로그인을 하지 않아도 되는 기능을 말한다.
그림 1. 로그인 상태 유지 - 기술 페이지
그림 2. 로그인 상태 유지 - 기술 페이지 (로그인 후)
그림 3. 로그인 상태 유지 - 데이터베이스
2. 데이터베이스 - 영구 토큰(Persistent Token)
설계를 따로 해야 하는 건 아니고, 스프링 시큐리티의 공식 문서에 정의가 되어 있는 부분이다.
그림 4. Spring-Security References 사이트에 정의된 Persistent Login(Remember-Me) 스키마
자동 로그인에 대한 스키마가 기술되어 있다.
그림 5. Spring-Security References 사이트에 기술된 Persistent Token Approach
사용 방법에 대해서 기술되어 있다.
3. 데이터베이스 - SQL 코드
CREATE TABLE persistent_logins (
username VARCHAR(64) NOT NULL,
series VARCHAR(64) PRIMARY KEY,
token VARCHAR(64) NOT NULL,
last_used TIMESTAMP NOT NULL
);
이 코드를 DBMS로 질의하면 기본적인 준비는 끝난다고 보면 된다.
그림 6. Oracle SQL Developer - 질의 창
그림 7. PERSISTENT_LOGINS 테이블
그림 8. PERSISTENT_LOGINS 테이블 ER-D
3. security-content.xml - 수정
경로: /src/main/webapp/WEB-INF/spring/security-context.xml
아래의 그림처럼 수정해주면 된다.
그림 9. 쿠키 제거 기능 주석 부분과 자동 로그인 주석 부분 - 수정 및 추가 할 것
<!-- 쿠키 제거 기능 개선 -->
<logout logout-url="/logout" logout-success-url="/"
invalidate-session="true" delete-cookies="remember-me,JSESSION_ID" />
<!-- 자동 로그인(2020-09-26 // 추가 작업 -->
<remember-me data-source-ref="dataSource" token-validity-seconds="604800" />
dataSource의 정의에 대해서 다시 한번 기술하도록 하겠다.
건강한 비판을 해보면, 일부 시중 책을 보면, 전혀 DataSource 내용은 누락해서 나온 책들도 꽤 있다.
삽질하는 시간이 줄어들고 잠도 푹 자는 개발자가 되길 희망한다.
(중략)
<!-- DataSource 추후 지원 -->
<!-- 1. HSQLDB -->
<!-- ClassDriver = org.hsqldb.jdbcDriver -->
<!-- Url = jdbc:hsqldb:hsql://localhost:9001 -->
<!-- 2. Oracle JDBC -->
<!-- ClassDriver = oracle.jdbc.driver.OracleDriver -->
<!-- Url = jdbc:oracle:thin:@127.0.0.1:1521:orcl -->
<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<beans:property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
<beans:property name="username" value="{사용자계정명}" />
<beans:property name="password" value="{비밀번호}" />
</beans:bean>
(중략)
파일명: security-context.xml
[첨부(Attachments)]
4. View = src/main/webapp/WEB-INF/views/member/loginForm.jsp
아래처럼 화면을 설계해주면 된다.
그림 10. 로그인 상태 유지 - 기술 페이지(User-Interface)
<%@ 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="/login" 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)]
* 맺음글(Conclusion)
간단하게 "자동-로그인(remember-me)" 기능에 대해서 Spring-Framework 5.x, Spring-Security 5.4를 기반으로 살펴보았다.
다음 글은 "자동 로그인 또는 로그인 상태 유지"라는 주제로 글을 작성하였으니 참고하면 좋겠다.
1. [Spring-Framework] 15. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-XML) (3), 2020-09-26