inblog logo
|
[HootJem] 개발 기록 블로그
    springboot

    [v2] Spring 게시판 조금 알고 따라하기 - 5

    세션을 통한 로그인, 로그아웃 기능을 구현하겠습니다. 그리고 개발자 도구를 활용한 저장된 쿠키 확인방법을 살펴보겠습니다!
    HootJem's avatar
    HootJem
    Aug 22, 2024
    [v2] Spring 게시판 조금 알고 따라하기 - 5
    Contents
    1. 레포지토리 작성2. 테스트3. 컨트롤러 작성4. 확인5. 헤더 설정6. 로그아웃 설정
     

    🔎세션을 통한 로그인, 로그아웃 기능을 구현하겠습니다. 그리고 개발자 도구를 활용한 저장된 쿠키 확인방법을 살펴보겠습니다!

    1. 레포지토리 작성

    매개변수로 전달받은 username, password 가 같은 컬럼을 찾는 쿼리문입니다.
    public User findByUsernameAndPassword(String username, String password) { Query query = em.createQuery("select u from User u where u.username = :username and u.password = :password", User.class); query.setParameter("username", username); query.setParameter("password", password); User user = (User) query.getSingleResult(); return user; }
     

    2. 테스트

    작성한 코드가 잘 작동되는지 테스트를 합니다.
    @Test public void findByUsernameAndPassword_test() { String username = "love"; String password = "1234"; User user = userRepository.findByUsernameAndPassword(username, password); System.out.println(user.getUsername()); System.out.println(user.getEmail()); } /* 실행결과 Hibernate: select u1_0.id, u1_0.created_at, u1_0.email, u1_0.password, u1_0.username from user_tb u1_0 where u1_0.username=? and u1_0.password=? love love@nateSELECT * FROM BOARD_TB .com */
     

    3. 컨트롤러 작성

    로그인 요청을 위한 컨트롤러를 작성합니다.
    로그인 정보는 session 에 저장하여 애플리캐이션 작동중에 사용할 수 있도록 합니다.
    @Autowired private HttpSession session; @PostMapping("/login") public String login(UserRequest.LoginDTO loginDTO) { User sessionUser = userRepository.findByUsernameAndPassword(loginDTO.getUsername(), loginDTO.getPassword()); session.setAttribute("sessionUser", sessionUser); return "redirect:/board"; }
     

    4. 확인

    정보가 저장된 session 을 확인하는 방법입니다.
    F12 눌러 개발자 툴을 열고 네트워크를 클릭한 뒤 새로고침 하면 다음과 같이 뜹니다.
    저는 /board 를 요청했기 때문에 board 를 클릭하겠습니다.
    notion image
     
    이렇게 Response Headers과 Request Headers 가 있는 모습을 볼 수 있습니다.
    notion image
     
    로그인을 합니다
    notion image
    로그인 성공 후 다시 리스폰스 헤더를 확인해 보면 쿠키를 갖고 있는 것을 볼 수 있습니다.
    notion image
    notion image
    이곳에 저장되는것!
     
    이후 쿠키에 저장된 정보는 다른 게시글로 가더라도 들고다니게 됩니다.
    notion image
    주의 : 해당 쿠키 값은 더미 데이터의 결과로 중요한 정보가 담긴 쿠키값은 웹 공개를 하지 않는 것을 권장합니다.

    5. 헤더 설정

    로그인을 한 유저라면 로그아웃, 글쓰기 로그인을 하지 않았다면 회원가입, 로그인이 표시되어야합니다.
    notion image
     
    <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> {{#sessionUser}} <li class="nav-item"> <a class="nav-link" href="/board/save-form">글쓰기</a> </li> <li class="nav-item"> <a class="nav-link" href="/logout">로그아웃</a> </li> {{/sessionUser}} {{^sessionUser}} <li class="nav-item"> <a class="nav-link" href="/join-form">회원가입</a> </li> <li class="nav-item"> <a class="nav-link" href="/login-form">로그인</a> </li> {{/sessionUser}} </ul> </div>
    사용된 문법을 해석하자면
    {{#sessionUser}}{{/sessionUser}} : sessionUser 정보가 존재할때
    {{^sessionUser}}{{/sessionUser}} : ELSE, 정보가 없을때를 의미합니다.
     
    notion image
    notion image
    실행하여 로그인 해 보면 설정한 대로 sessionUser 를 확인하여 화면에 표시되고 있음을 알 수있습니다.
     

    6. 로그아웃 설정

    @GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/board"; }
    session 객체의 invalidate 함수입니다. invalidate 이 메서드는 현재 세션을 무효화하고, 세션과 관련된 모든 데이터를 제거합니다. 세션이 무효화되면 사용자의 인증정보가 삭제되어 더이상 로그인 상태가 유지되지 않습니다.

    스프링부트 게시판 시리즈 v2 -1. https://inblog.ai/hj/27190 (User 테이블 생성 및 쿼리 수정) -2. https://inblog.ai/hj/27193 (User, Board 테이블 조인 과 JPQL) -3. https://inblog.ai/hj/27224 (회원 가입) -4. https://inblog.ai/hj/27225 DTO 를 통한 리팩토링 -5. https://inblog.ai/hj/27310 로그인, 로그아웃 -6. https://inblog.ai/hj/27316 서비스 레이어 추가 및 DTO 활용 -7. https://inblog.ai/hj/27430 예외처리 핸들러 설정과 User 서비스 리팩토링 -8. https://inblog.ai/hj/27431 Board 기능 리팩토링 -9. https://inblog.ai/hj/27560 게시글 수정, 더티체킹(flush) -10. https://inblog.ai/hj/27561 인터셉터, AOP 사용 / 마무리
     
    Share article
    Contents
    1. 레포지토리 작성2. 테스트3. 컨트롤러 작성4. 확인5. 헤더 설정6. 로그아웃 설정

    [HootJem] 개발 기록 블로그

    RSS·Powered by Inblog