< 수업 순서 - 2024.09.19 >
01. project 생성

02. pom.xml - spring 프로젝트 그대로 복사 붙여넣기
- 기존 pom.xml은 SpringMVC를 만들기 위한 최소 버전
03. Git - share Project

04. log4j.xml, log4jdbc.log4j2.poperites - spring 복붙

05. HomeController 실행

⭐Spring Security : 인증과 인가 기능을 제공하는 보안 프레임워크⭐
인증(Authentication) : 프로그램을 사용할 수 있는 사용자가 맞는지를 확인하는 절차
→ 인증을 정상적으로 수행하기 위해서는 사용자를 구분할 수 있는 정보 필요 - Credential
인가(Authorization) : 인증된 사용자가 요청한 자원에 접근 가능한가를 결정하는 절차
→ 인증 처리 후 권한을 부여 받을 수 있으며 권한은 일반적으로 역할(Role) 형태로 부여
Spring Security는 인증과 인가를 위해 Principal 객체(사용자의 모든 정보가 다 들어가 있음)를 아이디로 사용하고 Credential 객체를 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용
Spring Security를 SpringMVC 프로그램에 적용하여 제공 받을 수 있는 기능
1. 다양한 형태의 사용자 인증 방법 제공
- 폼로그인 인증, ⭐토큰 기반 인증, OAuth2 기반 인증, LDAP 인증
2. 프로그램 사용자의 역할에 따른 권한 레벨 적용
3. 프로그램에서 제공하는 자원에 대한 접근 제어
4. 데이터 암호화
5. SSL 적용
6. 일반적으로 알려진 웹보안 공격 차단
< Spring Security를 SpringMVC 프로그램에 적용하는 방법 >
1. 라이브러리 빌드 처리 : spring-security-web,spring-security-core, spring-security-config, spring-security-taglibs
- version 통일 : properites 엘리먼트 사용

- version 전부 같은 라이브러리 4개 빌드 처리

2. [web.xml] 파일에 Spring Security 기능을 제공하는 필터 클래스를 필터로 등록하고 필터가 실행되기 위한 URL 패턴을 매핑 처리
- 인증과 인가를 위해 Spring Security가 제공해주는 필터 이용 - DelegatingFileProxy 클래스(Main Filter)

3. [web.xml] 파일에 Spring Security 기능의 필터가 사용하기 위한 정보를 제공하는 Spring Bean Configuration File 설정 - ContextLoaderListener 클래스가 읽을 수 있도록 파일 경로 지정

4. Spring Security 기능을 구현하기 위한 Spring Bean Configuration File을 생성해 환경 설정
→ Spring Security 관련 필터가 동작되기 위한 정보를 security 네임스페이스를 추가하여 spring-security.xsd 파일에 설정된 엘리먼트를 사용하여 제공
06. security-context.xml
-
http 엘리먼트 : Spring Security 기능을 SpringMVC 프로그램에 적용하기 위한 정보를 제공하는 엘리먼트
→ Spring Security 관련 환경 설정이 시작되는 위치를 제공
- auto-config 속성값을 [true]로 설정한 경우 기본값으로 환경 설정
- user-expression 속성을 [true]로 설정하면 SpEL 표현식을 사용하여 페이지 접근 여부 설정 가능, false로 설정한 경우 SpEL 사용 불가능
-
SpEL 표현식 : 접근 권한을 나타내는 표현식
- hasRole('role') : 권한을 가지고 있는 경우에만 접근 가능하도록 나타내는 표현식
- hasAnyRole
- permitAll : 모든 사용자의 접근이 가능하도록 나타내는 표현식
- denyAll : 모든 사용자의 접근이 불가능하도록 나타내는 표현ㅅ
- isAnonymous() : Anonymous 사용자(인증 받지 않은 사용자)인 경우에만 접근 가능하도록
- isRememberMe() :
- isAuthenticated() :
- isFullyAuthenticated :
-
intercept-url : 요청 페이지에 접근 가능 권한을 설정하는 엘리먼트
- pattern 속성 : 요청 페이지의 경로 설정
- access 속성 : 페이지에 접근 가능한 권한(Role) 설정
-
authentication-manager : 인증 관리자를 등록하기 위한 엘리먼트, 다양한 형태의 인증 방식 제공
-
authentication-provider : 인증 제공자를 등록하기 위한 엘리먼트, 실질적인 인증 처리를 진행하는 기능 제공
-
user-service : 인증 정보를 등록하기 위한 엘리먼트, 인증 처리를 이용해 사용자의 권한 관련 정보를 반환하는 기능
-
user : 인증을 위한 정보 및 사용자의 권한 정보를 설정하는 엘리먼트
- name 속성 : 사용자를 구분하기 위한 식별자(아이디)를 속성값으로 설정
- password 속성 : 비밀번호 → 암호화 처리를 위해 비밀번호 앞에 {noop} 붙여 작성
- authorities 속성 : 권한(Role)

Spring Security Filter의 종류⬇️

07. HomeController(수정) : 요청 처리 메소드 작성

08. main_page.jsp : login 페이지는 요청처리 메소드를 따로 만들지 않아도 기본적으로 Spring Security에서 제공하는 페이지 有

- /login 주소를 get 방식으로 요청시 Spring Security에서 제공하는 페이지 출력

09. guest_page.jsp
10. manager_page.jsp
11. admin_page.jsp
12. security-context.xml
13. CustomPasswordEncoder : 비밀번호를 전달받아 암호화 처리하여 반환하거나 암호화 처리된 비밀번호를 비교한 결과를 반환하는 기능의 메소드가 작성된 클래스 - PasswordEncoder 인터페이스 상속
- 굳이 만들 필요 없음 : USER, AUTHORITIES 테이블 작성 시 비밀번호를 암호화 하지 않았기 때문에 임의로 클래스를 만들어 암호화 처리하여 비교

- security-context.xml : Spring Bean으로 등록

14. root-context.xml : spring 프로젝트 복붙
- Spring Security는 필터가 갖다 쓰는 Spring Bean은 모두 root-context.xml에 등록해야 함.

15. USERS 테이블, AUTHORITIES 테이블 : Spring Security가 사용하는 테이블 생성 - 컬럼명, 자료형 고정
-
사용자에 대한 권한이 여러개 있을 수도 있어서 사용자에 대한 테이블과 권한에 대한 테이블 각각 2개 생성
-
SQL 명령을 작성하지 않아도 기본적으로 제공되는 SQL 명령으로 인증 처리 후사용자 정보를 반환 - JdbcUserDetailsManager 클래스에 저장되어 있음

-
USER, AUTHORITIES 테이블 작성 시 컬럼명의 이름을 반드시 정해진 컬럼명으로 작성
📍로그인 정보가 잘 못됐을 때 메세지 설정
- 기본적으로 라이브러리가 제공하는 메세지 파일 목록

16. security_message.properties : spring-security-core 라이브러리의 message.properties 파일 참조하여 에러메세지 작성

17. root-context.xml : 인증 실패시 에러메세지를 제공하기 위한 메세지 파일(Properties 파일) 설정

18. LoginController

17. csrf.jsp
-
CSRF 공격 : 사이트의 요청을 위조하는 공격 방법
-
CSRF 공격을 방어하기 위해 Spring Security에서 발급된 CSRF Token을 hidden으로 전달
- 토큰을 전달하지 않으면 403 에러 발생

-
security-context.xml : 프론트앤드 개발자가 ajax 를 사용하지 않으면 토큰을 전달해줄 수 없기 때문에 disabled를 사용해 준다.

- hidden 타입으로 전달되는 토큰 주석처리해도 됨

-
입력페이지에서 post 방식으로 multipart/form-data 값을 전달 시 환경 설정
- web.xml : multipart Filter 등록

- root-context.xml : CommonsMultipartResolver 클래스 Spring Bean으로 등록

< 수업 순서 - 2024.09.20 >
📍기본으로 제공되는 USER, AUTHORITIES 테이블을 사용하지 않고 개발자가 원하는 대로 새로운 테이블을 만들어 인증 및 인가 커스터마이징
⭐ 사용자 정보를 암호화
01. 테이블 생성
- create table security_user(userid varchar2(100) primary key, password varchar2(100)
, name varchar2(50), email varchar2(100), enabled varchar2(1));
- create table security_auth(userid varchar2(100), auth varchar2(50)
, constraint auth_userid_fk foreign key(userid) references security_user(userid));
- create unique index auth_userid_index on security_auth(userid, auth);
02. SecurityUser : DTO 클래스
- 사용자 정보를 저장할 필드 작성
- 권한에 대한 정보를 저장할 List 객체를 필드로 작성
- ⭐사용자 정보와 권한 정보는 1 : N 관계
03. SecurityAuth : DTO 클래스
04. SecurityUserMapper.xml
-
사용자 정보 삽입 : insertSecurityUser
-
권한 정보 삽입(N) : insertSecurityAuth
-
사용자 아이디 전달받아 권한 검색 : selectSecurityAuthByUserid - resultMap의 collection 엘리먼트에서 사용될 select 명령
-
사용자 아이디 전달받아 사용자 정보 검색 : selectSecurityUserByUserid
-
resultMap 엘리먼트를 이용해 검색행의 컬럼값이 SecurityUser 객체 필드에 저장되도록 작성, SQL명령(select)에 Join을 사용해야하는데 길이가 길어지고 검색 속도도 느려짐, 그래서 resultMap 사용 - 속도 증가
-
⭐mybatis를 사용하는 목적 : resultMap, 동적 SQL 구현
⭐MyBatis 복습 : resultMap⭐
05. SecurityUserMapper.java : 추상 메소드 작성
06. SecurityUserDAO : SecurityUserMapper.java 와 동일
07. SecurityUserDAOImpl : sqlSession에 저장된 Mapper 객체의 메소드를 호출하여 행 반환
08. SecurityUserService.java
09. SecurityUserServiceImpl : DAO를 이용하여 메소드 호출
10. security-context.xml

11. SecurityUserController : 사용자 정보와 사용자 권한을 추가하는 메소드(addUser) 작성, 메소드 호출 성공시 "success" 글자 반환
➡️사용자 정보 및 권한 정보 커스터마이징
12. CustomUserDetails(UserDetails 인터페이스 상속) : 인증된 사용자 정보와 권한 정보를 저장하기 위한 클래스
→ 인증 성공 후 인증 정보 및 권한 정보가 저장된 UserDetails(작성 ❌, 존재) 객체를 Spring Security로부터 제공받아 사용 가능하지만 사용자 정보 및 권한 정보를 원하는 형태로 제공받기 위해 클래스 작성
-
UserDetails 객체에는 username, password, enabled 정보 밖에 없어서 새로운 객체(CustomUserDetails)를 만들어줌
-
인증된 사용자 정보가 저장될 필드 작성
-
인증된 사용자의 권한 정보가 저장될 필드 작성
-
매개변수로 전달받은 SecurityUser 객체의 필드값을 CustomUserDetails 객체의 필드에 저장
- 검색된 사용자의 권한 정보를 GrantedAuthority 객체로 생성하여 List 객체의 요소값으로 저장

13. CustomUserDetailsService : 테이블에 저장된 사용자 정보 및 권한 정보를 검색하여 인증 처리 후 사용자 정보 및 권한 정보가 저장된 UserDetails 객체를 반환하는 메소드가 작성된 클래스

- security-context.xml : DAO Spring Bean으로 등록


-
원래는 servlet-context.xml에 dao를 spring Bean으로 등록해줬는데 그렇게 하면 Front-Controller가 갖다 쓰는 것이고 security-context.xml에 dao를 spring bean으로 등록해줘야 filter에서 가져가 씀
인증에 대한 dao는 security-context.xml에 작성
-
자동 - Spring Container 제공 : 편하다 하지만 내가 원하는 정보들을 얻을 수 없다
-
수동(권장) - 커스터마이징 : 불편하다 하지만 내가 원하는 정보들을 쉽게 얻을 수 있다