WEB Application

TIL 웹 프로그래밍 (인증 / 인가 처리, 자바로 웹 파일 업로드 )

Tech Signal 2020. 9. 24. 21:24

<보안 처리>

순서: 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()를 가짐 (라이프사이클 콜백, 리퀘스트 콜백) 

doFilter()에서 chain.doFilter()를 사용한다.

- web.xml에서 Filter 등록, 매핑 방법은 서블렛과 동일. 등록 순서에 유의해야한다. (chain 에서의 순서와 같다) web.xml에서 에 올수록 먼저 필터 실행된다!

- 필터 체인 중간에 doFilter()가 끊기면 응답 데이터 내보낼 수 없음

 

Redirect는 블라인드 불가! / 인증할 때는 무조건 Redirection으로 응답 내보낸다!!!

대부분의 보안 framework는 위와 같은 filter를 사용한다.

<인가처리 Authorization>

권한 없는 자가 접근했을 시 => 401, 403 Error 필요


파일 업로드로 보는 <파라미터가 Query String의 형태로 존재하지 않고 part만 있는 경우>

** 이 부분은 Servlet 3.0 이상에서만 가능합니다.

web.xml에서 multipart-config를 넣어준다.

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로 걸러줘야함

multipart data의 예시 

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.)