카테고리 없음
Spring 25 - cecurity (자동로그인 구현해보자)
inderrom
2023. 2. 14. 18:51
자동로그인 테이블 생성
CREATE TABLE PERSISTENT_LOGINS(
USERNAME VARCHAR2(50),
SERIES VARCHAR2(200),
TOKEN VARCHAR2(200),
LAST_USED TIMESTAMP,
CONSTRAINT PK_PL PRIMARY KEY(SERIES)
);
<security-context.xml>
- security:http 수정
<!-- 데이터소스를 지정하고 테이블을 이용해서 기존 로그인 정보를 기록
쿠키의 유효시간을 지정함
token-validity-seconds : 쿠키의 유효시간(초) 604800초는 7일
-->
<security:remember-me data-source-ref="dataSource"
token-validity-seconds="604800" />
<!-- 로그아웃 처리를 위한 URI를 지정하고, 로그아웃한 후에 세션을 무효화 함
customLogoutSuccessHandler(사용자정의 로그아웃 성공 처리자)
JSESSION_ID : 웹브라우저(유일한 세션)의 그 유일한 세션값을 쿠키에 담고있음
-->
<security:logout logout-url="/logout" invalidate-session="true"
success-handler-ref="customLogoutSuccessHandler"
delete-cookies="remember-me,JSESSION_ID" />
<loginForm.jsp>
- <input type="checkbox" name="remember-me"
class="custom-control-input"
id="customCheck"> - name="remember-me" 로그아웃을 하지 않는 이상 유지가 됨
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<div class="row justify-content-center">
<div class="col-xl-10 col-lg-12 col-md-9">
<div class="card o-hidden border-0 shadow-lg my-5">
<div class="card-body p-0">
<!-- Nested Row within Card Body -->
<div class="row">
<div class="col-lg-6 d-none d-lg-block bg-login-image"></div>
<div class="col-lg-6">
<div class="p-5">
<div class="text-center">
<h1 class="h4 text-gray-900 mb-4">Welcome Back!</h1>
<h2>${error}</h2>
<h2>${logout}</h2>
</div>
<form class="user" action="/login" method="post">
<div class="form-group">
<input type="text" class="form-control form-control-user"
id="username" name="username" aria-describedby="username"
placeholder="아이디를 입력해주세요" required="required">
</div>
<div class="form-group">
<input type="password" class="form-control form-control-user"
id="password" name="password" placeholder="비밀번호를 입력해주세요" required="required">
</div>
<div class="form-group">
<div class="custom-control custom-checkbox small">
<input type="checkbox" name="remember-me"
class="custom-control-input"
id="customCheck"> <label class="custom-control-label"
for="customCheck">Remember Me</label>
</div>
</div>
<button type="submit" class="btn btn-primary btn-user btn-block">
Login </button>
<hr />
<!--
CSRF(Cross-site request forgery)
크로스 사이트 요청 위조는 웹 사이트 취약점 공격의 하나로,
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위
(수정, 삭제, 등록)를 웹사이트에 요청하게 하는 공격
-->
<sec:csrfInput/>
</form>
<hr>
<div class="text-center">
<a class="small" href="register.html">Create an Account!</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
재기동 후 로그인 -> 페이지를 나가도 다시 접속했을 때 로그인이 유지가 된다.
그리고 데이터 베이스에도 데이터가 들어간다.