로그인 컨트롤러
- 로그인을 위한 컨트롤러

Tiles 설정(view)
- login은 왜 home.*.*인가?
- root 디렉토리이지만, 이것을 그냥 *.*으로 설정할 경우, 다른 tiles도 모두 호출되어 문제가 발생할 수 있어으므로 루트 디렉토리의 것만 호출한다는 의미로만 home을 붙인다.(의미상으로 추가한것)

spring security 라이브러리 추가
- spring-boot-starter-security

보안이 필요한 페이지 설정

- 누군 되고 누군 안되는지?
- auth.ldap
- DC도메인 컨트롤러에서 WebServer에 유저 정보를 전달하는 프로토콜
- auth.jdbcAuthentication
- auth.inMemoryAuthentication
- 유저의 폭이 좁을때. 메모리에 추가해서 사용하는 방식
- password에 {noop}을 붙임으로써 비밀번호 인코딩을 제거

- 어떤건 되고 어떤건 안되는지
- http.authorizeRequests()
- antMatchers("url")
- security를 적용하고자 하는 url
- 주의사항 : /admin/** >> resouces root 디렉토리까지 모두 탐색함.(그냥 /admin/ 으로 하면 /admin/ 을 포함하는 모든 디렉토리가 해당됨)
- permitAll()
- 권한 없어도 모두가 접근가능(anonymous까지)
- hasAnyRole()
- anthenticated()
- formLogin()
- loginPage("url") : 인증을 필요로 할때 redirect 할 로그인 페이지 설정
- loginProcessingUrl("url") : 로그인이 진행중인 URL. 즉, 로그인을 위한 form 데이터를 전송한 url
- defaultSuccessUrl("url") : 필터에 걸려서 로그인 페이지로 간 것이 아닌, 로그인 페이지로 직접 이동하여 로그인을 한 경우, 로그인 성공시 redirect 되는 기본 url
- logout()
- logoutUrl("url") : 로그아웃 요청이 들어간 url
- logoutSuccessUrl("url") : 로그아웃 성공시 redirect되는 url
- invalidateHttpSession(true/false) : session 초기화 여부

Cross Site Request Forgery
- get요청을 통해 form을 받고, form 전송을 통해 post요청을 하는데, form을 받아온 사이트와, post요청을 보낼 사이트가 다른경우.
- 해결
- get요청에대한 응답을 보낼때 key생성 > post요청시 key 검사
- 또는 csrf().disable();
메인페이지 controller mapping & tiles 정의
- controller mapping

- tiles 정의

로그인 로그아웃 버튼 설정
- spring-security-taglabs 라이브러리 추가

- jsp 태그라이브러리 추가

- spring이 제공하는 expression-based access control 사용하여 ui 조건 검사
- isAnonymous() : 비인증된 상태인지?
- isAuthenticated() : 인증된 상태인지?

jdbcAuthentication()
- spring이 지정한 계정정보 : id, password, disabled
- spring이 지정한 권한정보 : id, roleId
- roleId는 무조건 ROLE_*** 형식으로 DB에서 가져와야함
- 비밀번호가 BCrypt 인코딩 되있다면 검사할때도 같은 인코딩으로 검사 해야함.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//누군 되고 누군 안되는지?
auth .jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery("select uid id, pwd password, 1 enabled from Member where uid=?")
.authoritiesByUsernameQuery("select uid id, 'ROLE_ADMIN' roleId from Member where uid=?")
.passwordEncoder(new BCryptPasswordEncoder());
}