카테고리 없음

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>

데이터 들어감

 

재기동 후 로그인 ->  페이지를 나가도 다시 접속했을 때 로그인이 유지가 된다.

그리고 데이터 베이스에도 데이터가 들어간다.