이전 글 : 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", ..
JPA 양방향 매핑 사용시 순환참조 문제가 발생할 수 있다. 상단 코드에서 Board와 Reply 엔티티는 일대다 양방향 매핑을 사용하고 있으며, Reply가 연관관계의 주인이 되어 fk를 가진다. 얼핏 보면 큰 문제가 없어보이지만, 다음과 같은 코드를 작성하면 문제가 발생할 수 있다. @GetMapping("/test/board/{id}") public Board getBoard(@PathVariable int id) { return boardRepository.findById(id).get(); } 위 코드는 @PathVariable로 넘겨받은 id값을 바탕으로 레포지토리에서 Board객체를 찾아서 반환하는 코드이다. 여기서 jackson이라는 라이브러리가 Board객체의 getter를 사용하여 엔티..
스프링 시큐리티 많은 프로젝트들이 기본적인 회원 관리를 필요로 하고 있고, 그것을 위해서 보안에 관련된 다양한 처리가 필요하다. 스프링은 spring security라는 하위 프레임워크에서 인증(Authentication)과 인가(Authorization)에 관련된 다양한 기능을 제공하고 있다. 인증(Authentication): 접근하려는 유저에 대한 확인 절차 (login, join..) 인가(Authorization): 인증된 사용자에 대해서 권한을 관리하는 것 접근주체(Principal): 보호 대상에 접근하려는 유저 비밀번호(Credential): 대상에 접근하려는 유저의 비밀번호 스프링 시큐리티 동작 원리 스프링 시큐리티는 이러한 인증과 인가를 위하여 Principal(=username)과 C..
AJAX (Asynchronous Javascript And Xml) JS의 라이브러리 중 하나로, 전체 페이지를 고치지 않고도 페이지의 일부만을 위한 데이터를 로딩하는 기법. 자바스크립트를 이용해서 서버에 데이터를 요청하는 것을 말한다. 즉 웹 브라우저에 어떤 요청을 했을때 페이지 전체를 새로고침하는 것이 아닌, 일부를 랜더링하여 뷰를 갱신할 수 있다. ajax를 사용하는 이유 1. 요청이 아닌 응답을 html이 아닌, data(json)을 이용하여 받을 수 있다 회원가입을 서버에 요청했다면, 서버는 정보를 DB에 저장하고 그에 대한 응답을 해주게 되는데, ajax가 없다면 데이터를 이용하는 것이 불가능하다. (만약 서버가 html로만 응답할 수 있다면, 환경에 따른 response의 폭이 좁아지고 한..
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)에 따라서 별도의 파일이 사용되게 ..
타임리프는 스프링과 통합을 위한 다양한 기능을 제공한다. 타임리프 템플릿 엔진 스프링 빈 등록 스프링 부트는 build.gradle에 코드를 추가해주면 타임리프 템플릿 엔진을 스프링 빈에 등록하고, 타임리프용 뷰 리졸버를 스프링 빈으로 등록할 수 있게 해준다. (자동화 가능하다) implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 입력 폼 활용 name th:object를 적용하기 위해서는 Controller부분에서 model을 이용해서 오브젝트를 뷰로 전달해주고, 뷰에서는 form태그에 th:action과 th:object를 적용한 후 밑에서 타임리프 문법을 이용해서 전달받은 오브젝트로 사용하면 된다. 또한 th:object의..
https://www.thymeleaf.org/기본 기능: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html공식 메뉴얼 - 스프링 통합: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html - 타임리프는 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용도로 사용하는 템플릿 엔진이다.다른 대표적인 SSR(서버사이드 렌더링) 언어인 jsp보다 더 스프링 친화적이기도 하고 jsp와 달리 순수 HTML형태를 유지하기 때문에 서버를 거치지 않고도 동적으로 렌더링된 결과를 확인하기에 좋다. - 기본적으로 타임리프는 기존 HTML태그에 th:*속성을 지정하는 방식으로 동작한다. th:..
@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 등의 다양한 옵션들이 존재한다. 만약 개발자들이 이러한 옵션들을 텍스트로 파싱하고 규약에 따라서 응답을 내려주어야 ..