[v2] Spring 게시판 조금 알고 따라하기 - 5
세션을 통한 로그인, 로그아웃 기능을 구현하겠습니다.
그리고 개발자 도구를 활용한 저장된 쿠키 확인방법을 살펴보겠습니다!
Aug 22, 2024
🔎세션을 통한 로그인, 로그아웃 기능을 구현하겠습니다.
그리고 개발자 도구를 활용한 저장된 쿠키 확인방법을 살펴보겠습니다!
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 를 클릭하겠습니다.
이렇게 Response Headers과 Request Headers 가 있는 모습을 볼 수 있습니다.

로그인을 합니다

로그인 성공 후 다시 리스폰스 헤더를 확인해 보면 쿠키를 갖고 있는 것을 볼 수 있습니다.


이곳에 저장되는것!
이후 쿠키에 저장된 정보는 다른 게시글로 가더라도 들고다니게 됩니다.

주의 : 해당 쿠키 값은 더미 데이터의 결과로 중요한 정보가 담긴 쿠키값은 웹 공개를 하지 않는 것을 권장합니다.
5. 헤더 설정
로그인을 한 유저라면 로그아웃, 글쓰기
로그인을 하지 않았다면 회원가입, 로그인이 표시되어야합니다.

<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, 정보가 없을때를 의미합니다.

실행하여 로그인 해 보면 설정한 대로 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