<보안 처리>
순서: Authentication -> Authorization
인가 처리, 인증 처리를 해서 접근 제어를 해줘야한다. 의도적으로 주소를 입력해 접속하는 것도 제어해야함.
=> 모든 요청에 대해 보안 처리를 하려면 Front Controller 앞에서 해줘야함.
<인증처리 Authentication>
D.F.P(Decorating Filter Pattern) 을 사용한다.
- Decorating 패턴 : 비즈니스 로직은 아니지만 부가적으로 추가하고 싶을 때 사용
- Filter: HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 객체
변경? 원본에서 Wrapper 로 감싸진다.
- 용도: 사용자 인증이나 권한 체크, request의 전처리와 response의 후처리를 담당하는 역할함
Filter Chain: 필터가 여러개일 때 Filter Chain으로 관리. 어떤 필터들이 있는지 정보를 가지고 있다.
- 스택 메모리의 구조 때문에 요청/응답 시에 실행 순서가 다르다.
- Servlet 패키지의 Filter 인터페이스를 상속받아 사용. init(), destroy(), doFilter()를 가짐 (라이프사이클 콜백, 리퀘스트 콜백)
- web.xml에서 Filter 등록, 매핑 방법은 서블렛과 동일. 등록 순서에 유의해야한다. (chain 에서의 순서와 같다) web.xml에서 위에 올수록 먼저 필터 실행된다!
- 필터 체인 중간에 doFilter()가 끊기면 응답 데이터 내보낼 수 없음
Redirect는 블라인드 불가! / 인증할 때는 무조건 Redirection으로 응답 내보낸다!!!
대부분의 보안 framework는 위와 같은 filter를 사용한다.
<인가처리 Authorization>
권한 없는 자가 접근했을 시 => 401, 403 Error 필요
파일 업로드로 보는 <파라미터가 Query String의 형태로 존재하지 않고 part만 있는 경우>
** 이 부분은 Servlet 3.0 이상에서만 가능합니다.
form 에서 데이터 넘길 때 enctype을 ="multipart/form-data"로 바꿔두면 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfuLVqBxKXeP1j7rC' 이런식으로 part가 여러개(즉 multi part)가 됩니다.
multipart: Request body를 여러개로 나누어 각각의 파트가 파라미터 name을 포함함. (Request Body가 있으려면 당연히 POST 방식이겠죠?)
- input의 name속성이 part의 이름을 결정한다. = form 태그 안에 input 태그가 몇개냐에 따라 part 가 나뉜다.
- 데이터를 입력하지 않아도 part는 나뉜다. -> 서버에서 무의미한 데이터는 filter로 걸러줘야함
Multi Part로 데이터를 가져올 때의 장점
1. part API 사용가능
2. text로 된 part 는 파라미터를 만들어준다.
<코드 작성 시 해야할 것들>
- Wrapper 2개가 필요하다. (Wrapper 가 뭐죠? 클릭!)
1. 파트를 감쌀 Part Wrapper (파트에서 원본 파일명을 꺼내기 위해)
- Part Wrapper의 개수= 현재 요청 안에 든 Part의 개수
- PartWrapper는 Part 인터페이스를 상속받는다. Part 가 가지는 메서드는 여러개가 있는데요 그 중에 delete()는?
클라이언트가 업로드하려는 게 1기가면 파일은 잘게 쪼개져서 보내져야한다. 예를들어 밴드가 100mb를 지원하면 100개의 chunk로 분리되어야함. 그 chunk들을 이어붙인뒤 getInputStream() 할 수 있다. delete()는 그 chunk를 삭제하는 메서드다.
2. 요청을 감쌀 Request Wrapper (PartWrapper를 감싸고 있는 원본 요청을 감싸 원본 요청의 일부 성격을 바꾸기 위해)
참고로 RequestWrapper의 parseRequest()에서 partWrapper가 만들어진다.
3. 파일을 업로드할 때 겹치지 않는 파일명이 필요하다면 UUID(Universally Unique Identifier)를 이용한다.
4. 이미지가 아닌 파일 거르기
Query String 형식으로는 이미지를 보낼 수 없다. 그러므로 무조건 Part형식으로 보내야한다. 또한 이미지 등록 외에도 수정도 할건데 그러면 적어도 2개의 commandhandler가 움직여야한다.
----> 파일 업로드를 미리 처리해줄 수 있는 filter를 만들자. wrapper를 적극활용해 파일 처리를 끝낸 후 front controller로 보내자!
5. 파트가 생성될때는 데이터가 입력되지않아도 무조건 파트가 생성된다. -> 서버에서 걸러내야함.
<EL 예습>
<img src="${pageContext.request.contextPath}${saveURLs[0]}" />
★EL 장점: 어떤 scope에서 꺼낼건지, 형변환, 사이즈 체크 다 안해줘도 됨★
BUT 데이터 제어문의 형태는 갖지 않는다. (EL을 보완할 수 있는 방법 - JSTL.)
'WEB Application' 카테고리의 다른 글
TIL (Command 패턴, jQuery 폼 플러그인 ) (0) | 2020.10.03 |
---|---|
TIL 웹 프로그래밍 (Filter, Wrapper, JAVA 파일 업로드) (1) | 2020.09.26 |
웹 프로그래밍 (front controller 패턴에 resolvers 더하기) (1) | 2020.09.23 |
웹 프로그래밍 (xml 주의할 점, front controller 패턴 ) (3) | 2020.09.22 |
웹 프로그래밍 (xml resultMap 사용법, has many, xml 매핑) (0) | 2020.09.22 |