728x90
300x250

[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

https://yyman.tistory.com/1420



1. 결과(Result)

로그인 상태 유지에 관한 기술이다.

이 기능은 쉽게 말하면, "로그인 기억하기", "로그인 상태 유지"를 체크하면 일정 시간 동안 다시 로그인을 하지 않아도 되는 기능을 말한다.




그림 1. 로그인 상태 유지 - 기술 페이지




그림 2. 로그인 상태 유지 - 기술 페이지 (로그인 후)



그림 3. 로그인 상태 유지 - 데이터베이스



2. 데이터베이스 - 영구 토큰(Persistent Token)


설계를 따로 해야 하는 건 아니고, 스프링 시큐리티의 공식 문서에 정의가 되어 있는 부분이다.


https://docs.spring.io/spring-security/site/docs/current/reference/html5/#remember-me-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)]

security-context-modify.zip




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

loginForm-modify.zip



* 맺음글(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

https://yyman.tistory.com/1422


반응형

+ Recent posts