저번에 HTML 페이지를 이용한 에러 처리를 공부했다. https://eckrin.tistory.com/entry/Spring-MVC-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC [Spring MVC] 스프링 HTTP 에러 처리 기본 예외처리 자바의 경우, 예외가 발생했을 때 그 예외를 별도로 처리해주지 않는다면 해당 메소드를 호출한 상위 스택에 예외를 던지고, main에 이르러서까지 예외가 처리되지 않는다면 정 eckrin.tistory.com API 예외처리 그런데 앱 서버를 만드는 등 HTML을 사용할 수 없고 API를 사용해야 하는 경우에는 어떻게 해결할 수 있을까? 이 경우 HTML 오류 페이지를 만드는 단순한 방법으로는 ..
기본 예외처리 자바의 경우, 예외가 발생했을 때 그 예외를 별도로 처리해주지 않는다면 해당 메소드를 호출한 상위 스택에 예외를 던지고, main에 이르러서까지 예외가 처리되지 않는다면 정보를 출력하면서 main 쓰레드가 종료된다. 비슷하게 웹 애플리케이션의 경우 사용자 요청별로 별도의 쓰레드가 할당되어 서블릿 컨테이너 안에서 실행되는데, 애플리케이션에서 발생한 에러를 서블릿 안에서 처리하지 못하고 바깥으로 전달되면 톰캣과 같은 WAS(Web Application Server)까지 예외가 전달된다. 그러면 WAS는 서버에서 처리할 수 없는 오류가 발생한 것으로 생각해서 HTTP 500 error를 발생시킨다. 커스텀 서블릿 오류 화면 설정 설정 이전에 에러시 Whitelabel 화면을 띄워주지 않도록 에러..
서블릿 필터 일반적으로 웹 서비스에서, 로그인을 해야 들어갈 수 있는 페이지들이 존재한다. 서블릿 필터가 없다면 이러한 기능을 위해서 각각의 컨트롤러에서 클라이언트가 알맞은 권한을 지녔는지 확인하고, 기능 추가시마다 별도로 필터를 추가해주어야 한다. 서블릿 필터는 클라이언트로부터 서버로 요청이 들어오면 서블릿(스프링이라면 Dispatcher Servlet으로 이해) 실행 직전에 필터링해준다. 권한O 사용자 : HTTP 요청 -> 서블릿 컨테이너 -> 필터 -> 서블릿 -> 컨트롤러 권한X 사용자 : HTTP 요청 -> 서블릿 컨테이너 -> 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) 이러한 필터는 하나 이상으로 구성될 수도 있다. 필터 사용필터를 사용하려면 Filter 인터페이스를 구현하고, 설..
이전 글 : https://eckrin.tistory.com/entry/Spring-MVC-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98 쿠키를 사용해서 로그인을 할 수 있지만, 쿠키 값은 클라이언트가 임의로 변경 가능하다. 또한 쿠키에 저장된 정보도 가져가서 보관할 수 있기 때문에, 보안상의 문제가 있다. (클라이언트쪽에 보관되는 것들은 무조건 보안에 위험이 있다.) 따라서 사용자별로 예측 불가한 임의의 토큰을 노출해서 클라이언트 쪽에서 해킹이 이루어져도 찾을 수 없게 만들고, 서버에서 토큰과 사용자 id를 매핑해서 인식한 후, 그 토큰을 서버에서 관리하게 하면 된다. 또한 토큰 자체의 만료시간을 설정해서 토큰을 악용하지 못하게 하자. 세션, 쿠키 활용 세션 기반 인증의 state..
로그인 api를 개발할 때, 쿠키(영속 쿠키, 세션 쿠키)를 이용하여 로그인 상태를 유지할 수 있다. @PostMapping("/login") public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response) { if(bindingResult.hasErrors()) { return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if(loginMember==null) { bindingResult.reject("loginFail", ..
https://eckrin.tistory.com/entry/Spring-MVC-%EA%B2%80%EC%A6%9D앞서 요청 검증방법에 대해서 알아봤다. 하지만 검증 기능을 지금처럼 매번 코드로 작성하는 것은 매우 번거롭다. 따라서 어노테이션을 이용한 검증방법인 Bean Validation에 대해서 알아보자. Bean Validation은 검증 어노테이션과 인터페이스들의 모음이며, 일반적으로 하이버네이트 Validator를 사용한다. Bean ValidationBean Validation을 사용하면 다음과 같은 검증 어노테이션들을 지원한다.@NotBlank : 빈값 + 공백만 있는 경우를 허용하지 않는다. @NotNull : null 을 허용하지 않는다. @Range(min = 1000, max = 1000..
Validation 개요 웹 어플리케이션 폼에서 숫자를 문자로 작성하는 등의 오류가 발생할 수 있다. 이러한 처리를 별도로 해주지 않는다면 사용자는 오류 페이지로 이동하고, 처음부터 다시 입력해야 하는 문제가 생긴다. (실제 서비스에 적합하지 않다). 실제로 사용되는 웹 서비스들은 오류가 발생하면, 고객이 입력해놓은 데이터를 유지한 상태로 오류 현황을 알려주곤 한다. 타입 검증: 가격, 수량에 문자가 들어가는 등의 오류 필드 검증: 공백이 허용되지 않거나, 수 범위가 설정되는 등의 제약 필드 조합 검증: 여러 필드의 값을 조합하여 검증 (ex.가격*수량의 합이 10000 이하) 일반적으로 검증은 클라이언트 검증과, 서버 검증이 존재한다. 클라이언트 검증(using js)은 조작을 이용한 보안에 취약하다는..
개요 - 메세지 협업이나 실무의 과정에서 화면에 보이는 문구를 고치기 위해서는 HTML에 일일히 하드코딩된 단어들을 변경해야 할 수 있다. 이러한 경우 실수가 일어날 수 있고 단어의 수에 따라 매우 번거로울수도 있다. 따라서 이러한 단점을 해결하기 위해서 메세지를 한 곳에서 관리하는 방법이 있다. item=상품 item.id=상품 ID 이런 식으로 messages.properties와 같이 메세지 관리 파일을 만들고, HTML에서는 해당 데이터를 key값으로 불러서 사용하는 것이다. - 국제화 메세지를 각 나라별로 별도로 관리하면, 서비스 자체를 국제화 할 수 있다. properties파일을 여러개 만들어서 분리해서 접속 지역(HTTP 헤더 accept-language)에 따라서 별도의 파일이 사용되게 ..
@RequestMapping("uri") uri에 들어간 url 호출이 오면 애노테이션이 표시된 메소드가 실행되도록 매핑해준다. RequestMapping에 method속성으로 HTTP메서드(GET, POST, PUT...)를 지정하지 않으면 HTTP메서드와 무관하게 모두 호출되므로, 적절한 사용을 위해서는 method속성을 명시해주자 @RequestMapping(method = RequestMethod.GET) 다음과 같이 메서드를 지정해주면 GET방식의 요청만 받아들이게 되고, POST등의 다른 요청이 오면 MVC는 HTTP 405 상태코드를 반환한다 (Method Not Allowed) 또 @GetMapping 애노테이션 코드를 보면 안에 @RequestMapping 애노테이션의 method가 설정..
서블릿 웹 서버는 요청에 대해 정적 웹 페이지로 응답하는 방식의 서버이다. 여기에 동적인 응답을 내려주기 위해서 서블릿을 붙인 서버를 WAS(Web Application Server)라고 한다. 하지만 정적 페이지를 내려주기 위한 요청까지 처리하기에는 WAS에 부하가 걸릴 수 있으므로, 현재는 WAS 앞에 WS(웹 서버)를 붙여서 4 tier 아키텍처의 구조로 서버를 구성하는 것이 일반적이다. 그렇다면 서블릿을 붙였다는 것이 무슨 의미일까? HTTP 헤더에는 HTTP Method, Content-type, User-Agent, Host, Connection, Date, Keep-Alive 등의 다양한 옵션들이 존재한다. 만약 개발자들이 이러한 옵션들을 텍스트로 파싱하고 규약에 따라서 응답을 내려주어야 ..
웹 서버(Web Server) ㆍHTTP를 기반으로 동작 ㆍ정적 리소스(HTML, CSS, JS, 이미지, 영상) 제공 웹 애플리케이션 서버(WAS, Web Application Server) ㆍHTTP를 기반으로 동작 ㆍ웹 서버의 기능에 프로그램 코드를 실행하여 로직을 수행 ㆍ정적 리소스 + 동적 리소스 정적 리소스는 웹 서버가 처리하고, 남은 동적 리소스는 WAS에 처리를 위임하여 애플리케이션 로직을 전담한다. 그러면 WAS는 동적 리소스만 전담하여 처리할 수 있고, WAS에 오류 발생시 오류화면을 웹 서버에서 처리해줄 수 있는 장점이 있다. 서블릿(Servlet) 웹 서버에서 동작하는 웹 어플리케이션 컴포넌트(서비스 페이지)로, 웹브라우저의 요청에 따라서 서버가 실행하는 자바 프로그램을 말하는데, ..
원래는 @RequestMapping 어노테이션을 통해서 URL을 컨트롤러의 메서드와 매핑할때 요청 주소와 방식을 설정하였다. @RequestMapping(value="/check", method={RequestMethod.POST}) 이후 스프링이 업데이트되면서 일일히 RequestMapping의 method를 설정해주지 않고 직관적으로 설정하기 위하여 Mapping관련 어노테이션인 @GetMapping, @PostMapping등이 추가되었다. 일반적으로 GET과 POST매핑을 사용할때, 뷰의 form태그의 method에 따라서 요청 방식이, action에 따라서 uri가 결정된다. 이때, form의 요청을 발생시켜주는 페이지의 uri와 form으로 요청이 들어오는 uri가 같다면 action uri는 ..