본문 바로가기
Project/소경관

[소경관] : Session 적용하기

by 오주현 2022. 4. 17.
반응형
public interface SessionConst {

     String LOGIN_MEMBER = "userDTO";
}

Session을 다룰 때 글자만 참고해서 사용하기 위해서 상수를 인터페이스로 만들어주었다.

이렇게 만든 상수는 직접 사용은 하지 않는다.

 

/**
 *로그인 로직 처리
*/
//TODO: 2022-04-17아이디 비밀번호 체크 로직 필요, Session값 넘기는 로직 필요,예외 처리 필요
@PostMapping("/user/logIn/page")
public String login(@ModelAttribute UserVo userVo, HttpServletRequest request) throws Exception {

log.info(this.getClass().getName() + "로그인 로직 처리 시작");

    int res = 0;

    UserDTO userDTO = new UserDTO(userVo.getUserNo(), userVo.getUserId(), userVo.getUserPw());

    res = userService.login(userDTO);

    if (res == 1) {
        HttpSession session = request.getSession();
        session.setAttribute(SessionConst.LOGIN_MEMBER, userDTO);
    } else {
        return "user/login";
    }

log.info(this.getClass().getName() + "로그인 로직 처리 끝");

return "index";
}

HttpServletRequest request 에서 Session을 지원한다.

로그인 체크 로직을 수행하고 받은 값이 로그인 성공일 때 Session에 위에서 만들어둔 상수 값에 담아주어 리턴한다.

 

@Slf4j
@Controller
@RequiredArgsConstructor
public class HomeController {

    @GetMapping("/")
    public String index(
            @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)UserDTO userDTO, Model model) {

        if (userDTO == null ) {
            return "/user/logIn";
        }

        model.addAttribute("member", userDTO);

        return "/index";
    }
}

HomeController에서 인덱스 페이지를 들어갈 때 Session을 체크한다.

Spring에서 지원하는 @SessionAtrribute를 통해 위에서 Session에 값을 저장한 상수를 불러와 사용한다.

불러온 값이 null이면 다시 로그인 페이지로 돌러보내고, 그렇지 않으면 Session을 나중에 사용하기 위해 model 객체에 담아둔다.

 

# 세션 유지 시간을 설정한다. 초 단위로 적용된다.
server.servlet.session.timeout=1800

#URL 전달 방식을 끄고 항상 쿠키를 통해 세션을 유지한다.
server.servlet.session.tracking-modes=cookie

application.properties에서 Session에 대한 설정을 해주었다.

Session이 탈취당해도 안전하도록 Session time out 설정을해 주었고 URL 전달 방식을 끄고 항상 쿠키를 통해 세션이 유지되도록 설정해 주었다. (주석을 참고하자.)

 

@Slf4j
@RestController
public class SessionInfoController {

    /**
     * 정상적으로 세션을 가지고 있는지 체크하기 위한 테스트 경로 생성
     */
    @GetMapping("/session-info")
    public String sessionInfo(HttpServletRequest request) {
        HttpSession session = request.getSession(false);

        if (session == null) {
            return "세션이 없습니다.";
        }

        session.getAttributeNames().asIterator()
                .forEachRemaining(name -> log.info("session name = {}, value = {}", name, session.getAttribute(name)));

        log.info("sessionId = {}", session.getId());
        log.info("getMaxInactiveInterval = {}", session.getMaxInactiveInterval());
        log.info("creationTime = {}", new Date(session.getCreationTime()));
        log.info("lastAccessedTime = {}", new Date(session.getLastAccessedTime()));
        log.info("isNew = {}", session.isNew());

        return "세션 출력";
    }
}

세션 값이 정상적으로 생성, 삭제가 되었는지 체크하기 위한 임시 경로를 생성해 주었다.

로그인해서 세션값을 가지고 접속하면 세션 출력 화면과 로그에 가지고 있는 세션이 표시되고, 그렇지 않은 경우 세션이 없다는 메시지가 출력이 된다.

 


반응형

댓글