자동로그인 - 클라이언트 쿠키 처리
// 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;
}
}