minlog
article thumbnail

자동 로그인 설정  Remember Me

 

시큐리티를 사용하여 간단하게 구연할 수 있다. 

실제 로그인 로직을 살펴보면 remember-me  체크를 하고 로그인시 해당 쿠키가 발급되어 생성되는 것을 볼 수 있다 .

사용자가 애플리케이션에서 로그아웃 시 JSESSIONID 뿐만 아니라 remember-me 쿠키도 삭제된다.

 

 

Remember Me

웹 인증 방식 중 쿠키를 사용하는 방식

로그인 된 사용자가 브라우를 닫고 재 접속 해도 로그인 절차 없이 로그인 처리가 진행되는 것이다.

Remember-me 토큰 쿠키를 사용한다. 

 

 

  • filterChain 에  http.rememberMe() 추가
    • rememberMeParameter("checkbox name") :  remember-me기능을 사용할 체크박스의 이름과 동일 값 (html)
    • tokenValiditySeconds(60*60*24*7)  :  쿠키를 얼마나 유지할 것인지 초단위로 설정 가능 하며 소셜로그인에서는 사용 불가능 하다. (ex 7일 유지)
    • alwaysRemember(false)  : 사용자가 체크박스를 활성화하지 않아도 항상 실행 ( default: false )
    • userDetailsService(userDetailsService) : 로그인 기능 서비스 호출

 

📑SecurityConfig

package com.example.travel.config;

import com.example.travel.security.service.UserTravelDetailsService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Log4j2
@Configuration
public class SecurityConfig {

    @Autowired
    private UserTravelDetailsService userDetailService; //로그인기능

    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }


    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        
        ...

        // 자동 로그인
        http.rememberMe()
                .rememberMeParameter("remember")
                .tokenValiditySeconds(60*60*24*7)
                .alwaysRemember(false) 
                .userDetailsService(userDetailService);
		
        ...

        return http.build();
    }
}

 

 

📑 login.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/basic}">
<th:block layout:fragment="content">
  <div class="container-fluid mt-5">
    <div class="content_box">
      <h2 class="tit text-center mb-4">로그인</h2>
      <div class="loginForm">
        <form th:action="@{/login_proc}" method="post">
          <input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>
          <table>
            <colgroup>
              <col style="width:100px">
              <col style="width:calc(100% - 100px)">
            </colgroup>
            <tbody>
              <tr>
                <th>
                  <label for="username">
                    아이디
                  </label>
                </th>
                <td>
                  <input th:name="username" name="username" id="username" class="form-control id" type="text" placeholder="아이디를 입력하세요.">
                </td>
              </tr>
              <tr>
                <th>
                  <label for="password">
                    비밀번호
                  </label>
                </th>
                <td>
                  <input th:name="password" name="password" id="password" class="form-control id"
                         type="password" placeholder="비밀번호를 입력하세요.">
                </td>
              </tr>
            </tbody>
          </table>
          <div class="form-check form-switch pt-4 pb-4">
            <label class="form-check-label" for="remember"> 로그인 상태 유지</label>
            <input class="form-check-input" type="checkbox" role="switch" id="remember" name="remember">
          </div>
          <button class="btn btn-primary btn-lg w-100 " type="submit">로그인</button>
          <div class=" pt-4 pb-4 mt-4 text-center border-top">
            <a href="#">회원가입</a> |
            <a href="#">아이디 찾기</a> |
            <a href="#">비밀번호 찾기</a>
          </div>

          <div class="login_social pt-4 pb-4 text-center">
            <h2 class="mb-4">간편 로그인</h2>
             
             ...
             
          </div>

        </form>
      </div>
    </div>
  </div>
</th:block>
</html>
profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!