자동로그인 - 클라이언트 쿠키 처리

// MemberService.java
// LoginDto에서 자동 로그인 필드 getter 가져와 참인 경우 ~
if (dto.isAutoLogin()) {

//**자동로그인 처리 → 1. 쿠키 생성**(절대로 중복되지 않는 유니크한 값 저장)
//로그인유틸에 AUTO_LOGIN_COOKIE 추가 !
Cookie autoLoginCookie = new Cookie(AUTO_LOGIN_COOKIE, session.getId()); // 세션 아이디는 절대 중복이 안일어남 !

//2. 쿠키 설정
autoLoginCookie.setPath("/"); // 쿠키를 사용할 경로
autoLoginCookie.setMaxAge(60 * 60 * 24 * 90); //자동로그인 유지 시간 90일로 설정

//3. 쿠키를 클라이어트에게 전송 + 응답 파라미터 추가 (바디에 실어보내야 함 !)
response.addCookie(autoLoginCookie);

//4. **DB**에도 해당 쿠키값을 **저장** - **mapper 추가 !! 빌더** 
memberMapper.updateAutoLogin(AutoLoginDto.
            .builder()
            .sessionId(sessionId)  // 쿠키에 넣어둔 세션 아이디 session.getId();
            .limitTime(LocalDateTime.now().plusDays(90))
            .account(account)
            .build());

이렇게 추가 작성 후

: 개발자도구 application → Cookies 우리 사이트 도메인 → auto 값인 Value 변하지 않는 유니크한 쿠키값을 갖게 됨 & 만료일 90일 뒤로 설정되어 있음 !

이제 클라이언트에서 받아온 자동 로그인한 쿠키를 확인 후 서버에서 처리하도록 해야 한다.

자동로그인 - 데이터베이스 처리

**// 자바 코드 들어가기 전 자동로그인에 필요한 DB 세팅해주기** 
// tbl_member에 자동로그인 관련 컬럼 추가 (쿠키에 저장한 값과 자동로그인 만료 시간 저장)
ALTER TABLE tbl_member
ADD (session_id VARCHAR(255) DEFAULT 'none');

ALTER TABLE tbl_member
ADD (limit_time DATETIME DEFAULT current_timestamp);

select * from tbl_member;   // Apply 
// MemberMapper.java
// 자동로그인 쿠키값, 만료시간 업데이트
void updateAutoLogin(AutoLoginDto dto); // 3가지 데이터를 가져서 update 시겨줘야 함 -> 처리 dto 만들기

// AutoLoginDto.java
private String sessionId;  // 자동로그인 쿠키값
private LocalDateTime limitTime;  // 만료시간
private String account;   // 계정명

// MemberMapper.xml
<update id = "updateAutoLogin">
   UPDATE tbl_member
   SET session_id = #{sessionId}, limit_time = #{limitTime}
   WEHRE account = #{account}
</update>

이렇게 DB 추가 작업 후 브라우저 껐다 키면 자동로그인 유지되어 있지 않음 이 처리가 필요

자동로그인 - 인터셉터 처리

자동로그인인터셉터 클래스 만들고 preHandle 메서드 작업

(자동로그인 쿠키 → 클라이언트가 자동로그인 요청 보내면 쿠키팔찌를 차고 다닌다.

// AutoLoginInterceptor.java

@Configuration
@RequiredArgsConstructor
public class AutoLoginInterceptor implements HandlerInterceptor {

    private final MemberMapper memberMapper;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
       // 1. 사이트에 들어오면 자동로그인 쿠키를 가지고 있는지 확인
       // -> 클라이언트 요청에 쿠키 가져오기
       //Cookie[] cookies = request.getCookies(); // 요청 객체로 모든 값 가져오니 반복문으로 걸러주기
       //for (Cookie c : cookies) {
       //   if (c.getName().equals(LoginUtil.AUTO_LOGIN_COOKIE) {
             // 자동로그인 한 사람 처리
       //   }
       //}
       
       **// Spring에서 짧게 캡슐화 시켜서 쿠키값 하나만 뽑아올 수 있도록 만들어둠 !
       // -> request, 쿠키이름name 파라미터로 보내주기**
       Cookie autoLoginCookie = WebUtils.getCookie(request, LoginUtil.AUTO_LOGIN_COOKIE);
       
       // 2. 자동로그인 쿠키가 있으면 사이트 로그인 처리를 수행
       if (autoLoginCookie != null) {
          // 3. 쿠키에 들어있는 랜덤값을 읽기
          String sessionId = autoLoginCookie.getValue(); // 자동로그인 쿠키값을 게터하기
          
          // 4. 세션 아이디로 회원정보 조회 **-> sessionId로 회원정보 조회하는 select
          Member foundMember = memberMapper.findMemberBySessionId(sessionId);**
          
          // 5. 회원이 정상 조회되었고 자동로그인 만료시간 이전이라면
          // 사이트 로그인 처리(세션에 DTO세팅)를 수행
          if (foundMember != null && LocalDateTime.now().isBefore(foundMember.getLimitTime())) {
             // MemberService.java -> 로그인 처리 메서드 가져오기
             MemberService.maintainLoginState(request.getSession(), foundMember);
             // 다 만들었으니 InterceptorConfig.java에 추가 등록하기 !
          }
       }
       
       return true;
       }
   }