SPRING

[Spring Boot + JPA] LV.3 + LV.4

도원좀비 2025. 3. 28. 15:00

1️⃣ 요구사항 정리

Lv 3. 회원가입

  • 유저에 비밀번호 필드를 추가합니다.
  • 비밀번호 암호화는 도전 기능에서 수행합니다.

Lv 4. 로그인(인증)

  • HttpServletRequest / HttpServletResponse : 각 HTTP 요청에서 주고받는 값들을 담고 있습니다.
  • Cookie /Session을 활용해 로그인 기능을 구현
  • 필터를 활용해 인증 처리
  • @Configuration을 활용해 필터를 등록
  • 이메일과 비밀번호를 활용해 로그인 기능을 구현합니다.
  • 회원가입, 로그인 요청은 인증 처리에서 제외

2️⃣ API 명세

Method URL 설명
POST /authors/signup 비밀번호 암호화 포함 회원가입
POST /login 로그인
POST /login/logout 로그아웃

3️⃣ 주요 코드

더보기

(FilterConfig.java)

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<Filter> authoFilter() {
        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();

        registrationBean.setFilter(new AuthFilter());   // 내가 만든 필터 등록
        registrationBean.addUrlPatterns("/");           // 모든 경로에 적용
        registrationBean.setOrder(1);                   // 필터 실행 순서

        return registrationBean;
    }
}

 

(AuthFilter.java)

public class AuthFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String requestURI = httpServletRequest.getRequestURI();

        // 로그인/회원가입은 인증 없이 통과
        if (requestURI.startsWith("/login")
                || requestURI.startsWith("/authors")
                || requestURI.startsWith("/logout")) {
            chain.doFilter(request, response);
            return;
        }

        // 세션 검사 (없으면 로그인 X)
        HttpSession session = httpServletRequest.getSession(false);
        if (session == null || session.getAttribute(SessionConst.LOGIN_AUTHOR) == null) {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            httpServletResponse.getWriter().write("로그인이 필요합니다");
            return;
        }

        // 로그인 상태 >> 다음필터 or 컨틀로러로 전달
        chain.doFilter(request, response);
    }
}

 

(SessionConst.java)

public class SessionConst {
    public static final String LOGIN_AUTHOR = "LOGIN_AUTHOR";
}

 

(LoginController.java)

@RestController
@RequiredArgsConstructor
@RequestMapping("/login")
public class LoginController {

    private final LoginService loginService;

    @PostMapping
    public ResponseEntity<LoginResponseDto> login(
            @Valid @RequestBody LoginRequestDto dto,
            HttpServletRequest request
    ) {
        LoginResponseDto login = loginService.login(dto, request);
        return ResponseEntity.ok(login);
    }

    @PostMapping("/logout")
    public ResponseEntity<String> logout(HttpServletRequest request) {
        HttpSession session = request.getSession(false);

        if (session == null || session.getAttribute(SessionConst.LOGIN_AUTHOR) == null) {
            throw new CustomException(ExceptionCode.ALREADY_LOGGEFOUT);
        }

        session.invalidate();

        return ResponseEntity.ok("로그아웃 되었습니다.");
    }

}

(LoginService.java)

@Service
@RequiredArgsConstructor
public class LoginServiceImpl implements LoginService{

    private final AuthorRepository authorRepository;

    @Override
    public LoginResponseDto login(LoginRequestDto dto, HttpServletRequest request) {
        Author author = authorRepository.findByLoginIdOrElseThrow(dto.getLoginId());

        author.isLoginId(dto.getLoginId());
        author.isPassword(dto.getPassword());

        HttpSession session = request.getSession(true);
        session.setAttribute(SessionConst.LOGIN_AUTHOR, author.getAuthorId());

        return new LoginResponseDto(author.getAuthorId(), author.getLoginId(),author.getPassword());
    }
}

 

📌 GitHub 저장소: https://github.com/sukh115/schedulerJpa/lv4

 

GitHub - sukh115/schedulerJpa

Contribute to sukh115/schedulerJpa development by creating an account on GitHub.

github.com

 

'SPRING' 카테고리의 다른 글

[Spring Boot + JPA] LV.7  (1) 2025.03.28
[Spring Boot + JPA] LV.5+ Lv.6  (1) 2025.03.28
[Spring Boot + JPA] LV.2  (1) 2025.03.28
SPRING[Spring Boot + JPA] LV.1  (1) 2025.03.28
[Spring Boot + JPA] 트러블 슈팅  (2) 2025.03.28