로그인과 로그아웃은 Post방식으로 해야함 (get 방식 x)
-WebSecurityConfig
// TODO: 2) 로그아웃 설정
http.logout(
req -> req
.logoutUrl("/auth/customLogout") // 스프링에서 logout url 제공함 (로그아웃 페이지는 따로 필요없음)
.invalidateHttpSession(true) // session 삭제 후
.logoutSuccessUrl("/") // logout에 성공하면 /로 redirect
);
-header.jsp
<%-- 소메뉴 : Logout #4 : 메뉴 달때 form 태그로 달기 (바로 실행될 수 있도록) : post방식으로 숨겨서 --%>
<li class="nav-item">
<form action="/auth/customLogout" method="post">
<button type="submit" class="btn"> Logout </button>
<%-- csrf 보안 토큰 : 해킹 방지 토큰 --%>
<%-- 언제사용?: post,put, delete 방식 사용시 넣어주어야 인증됨--%>
<%-- 예) 로그인/로그아웃, 부서추가/수정, 사원추가/수정 등--%>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
</li>
-MemberService
// TODO: 회원가입 : save
public Member save(Member member) {
Member member2 = memberRepository.save(member);
return member2;
}
}
-MemberController
회원 가입 : insert -> post 방식 -> @PostMapping
1) 저장(회원가입) 페이지 열기 함수
@GetMapping("/register")
public String addMember() {
return "auth/register.jsp";
}
-MemberController
@PostMapping("/regist")
public RedirectView createFellow(
@ModelAttribute Fellow fellow
)
(1) 전달된 매개변수 객체가(fellow) DB 있는지 조사
=> 있으면 insert 할 필요없음 : 에러페이지로 강제이동
=> 없으면 insert 함
@PostMapping("/regist")
public RedirectView createFellow(
@ModelAttribute Fellow fellow
) {
if(fellowService.existsById(fellow.getUserId())==true) {
return new RedirectView("/auth/error");
}
(2) 위의 에러가 통과되면 새로운 회원(Fellow) 생성해서 저장(save)
=> 필수) 패스워드 : 암호화
Fellow newFellow = new Fellow(
fellow.getUserId(),
passwordEncoder.encode(fellow.getPassword()), // 필수 암호화
fellow.getName(),
fellow.getCodeName()
);
(3) DB 저장
fellowService.save(newFellow);
return new RedirectView("/auth/customLogin");
-전체코딩
@PostMapping("/regist")
public RedirectView createFellow(
@ModelAttribute Fellow fellow
) {
if(fellowService.existsById(fellow.getUserId())==true) {
return new RedirectView("/auth/error");
}
Fellow newFellow = new Fellow(
fellow.getUserId(),
passwordEncoder.encode(fellow.getPassword()), // 필수 암호화
fellow.getName(),
fellow.getCodeName()
);
fellowService.save(newFellow);
return new RedirectView("/auth/customLogin");
}

1) 매개변수 전달된(jsp 전송) member 가 DB 에 있으면
insert 할 필요 없음 : why? 기존 멤버(회원)
if(memberService.existsById(member.getEmail()) == true) {
return new RedirectView("/auth/error"); // 에러페이지 강제 리다이렉트
}

(1) 소메뉴 : Admin #1 : 관리자면 이 메뉴보이고, 사용자는 안보임 </sec:authorize>
=> isAnonymous() : 사용자에 권한명이 있다면 html 태그가 화면에 보임
<sec:authorize access="hasRole('ADMIN')">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Admin</a>
</li>
</sec:authorize>
(2) 로그아웃 처리
: <sec:authorize access="isAuthenticated()">html태그</sec:authorize>
<sec:authorize access="isAuthenticated()">
<%-- 로그아웃 #4 : Logout : form 태그 달기(post 방식) --%>
<li class="nav-item">
<form action="/auth/customLogout" method="post">
<button type="submit" class="btn">Logout</button>
<%-- TODO: csrf 보안 토큰 : 해킹 방지 토큰 --%>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
</li>
</sec:authorize>
