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

세션을 통한 로그인, 로그아웃 기능을 구현하겠습니다. 그리고 개발자 도구를 활용한 저장된 쿠키 확인방법을 살펴보겠습니다!
HootJem's avatar
Aug 22, 2024
[v2] Spring 게시판 조금 알고 따라하기 - 5
 

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

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

[HootJem] 개발 기록 블로그