inblog logo
|
harimmon
    스프링부트

    [스프링부트] 27. 스프링부트 뱅크 v1 로그인

    백하림's avatar
    백하림
    Mar 27, 2025
    [스프링부트] 27. 스프링부트 뱅크 v1 로그인
    💡

    세션과 쿠키의 역할

    1. 세션은 서버에서 사용자 정보를 관리하지만, 클라이언트가 세션 ID를 쿠키로 전달해야 서버가 이를 식별할 수 있다.
    1. 쿠키가 없거나 세션이 만료되면 사용자를 알 수 없고, session.getAttribute("metacoding")을 호출해도 null이 반환된다.
    1. 따라서, 세션을 유지하려면 브라우저가 세션 ID를 포함한 쿠키를 유지해야 한다.
    1. 현재 코드에서는 /login-form을 방문해야 세션이 생성되고, 이후에 /join-form에서 세션을 조회할 수 있다.
    정리하자면, "쿠키가 없으면 세션을 유지할 수 없고, 따라서 사용자를 알 수 없다

    로그인 로직 추가 코드 (BOLD체)

    UserController

    package com.metacoding.bankv1.user; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @RequiredArgsConstructor @Controller public class UserController { private final UserService userService; private final HttpSession session; @GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/"; } // 로그인만 예외로 Post (조회시에도) @POST (조회시에도) body에 던져야 하니까 password @PostMapping("/login") public String login(UserRequest.LoginDTO loginDTO) { User sessionUser = userService.로그인(loginDTO); session.setAttribute("sessionUser", sessionUser); // stateful return "redirect:/"; } @GetMapping("/login-form") public String loginForm() { return "user/login-form"; } @GetMapping("/join-form") public String joinForm() { return "user/join-form"; } @PostMapping("/join") public String join(UserRequest.JoinDTO joinDTO) { userService.회원가입(joinDTO); return "redirect:/login-form"; } }

    UserService

    public User 로그인(UserRequest.LoginDTO loginDTO) { // 1. 해당 유저네임이 있나? User user = userRepository.findByUsername(loginDTO.getUsername()); // 2. 필터링 (유저네임, 패스워드가 불일치하는 것들을) if (user == null) { throw new RuntimeException("해당 username이 없습니다"); } if (!(user.getPassword().equals(loginDTO.getPassword()))) { throw new RuntimeException("해당 password가 틀렸습니다"); } // 3. 인증 return user; }

    header.mustache

    {{#sessionUser}} <li class="nav-item"> <a class="nav-link" href="/account">계좌목록</a> </li> <li class="nav-item"> <a class="nav-link" href="/account/save-form">계좌생성</a> </li> <li class="nav-item"> <a class="nav-link" href="account/transfer-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}}
    💡
    {{#sessionUser}}, {{/sessionUser}} 로그인 하면 보이는 상태
    {{^sessionUser}}, {{/sessionUser}} 로그인 하기 전 보이는 상태
    Share article

    harimmon

    RSS·Powered by Inblog