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 |