일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Not Modified
- 캐시
- 검증헤더
- 세션타임아웃설정
- 쿠키생명주기
- supportParameter
- http
- 인증체크
- gradle오류
- no cache
- UrlResource
- etag
- 서블릿필터
- HTTP API
- Expires
- 프록시객체
- must revalidate
- 서블릿http세션
- 300
- 세션만들어보기
- www-Authenticate
- HTTP상태코드
- 프록시 캐시 서버
- 양쪽 모두 값 설정
- max age
- hikaricp
- 쿠키보안문제
- Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMain
- resolveArgument
- 조건부요청
- Today
- Total
목록전체 글 (47)
복습을 위한
아래 두 개의 엔티티가 있다. @Entity public class Team { @Id@GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") private List members = new ArrayList(); @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; // @Column(name = "TEAM_ID")
Aspect는 AOP(Aspect-Oriented Programming)에서 핵심적인 개념 중 하나입니다. AOP는 프로그래밍을 특정 관심사에 따라 모듈화하는 기법을 말합니다. 이것은 코드의 분리 및 모듈화를 통해 코드의 재사용성을 향상시키고 유지보수성을 높이는 데 도움이 됩니다. Aspect는 어떤 관심사를 구현하는 일련의 코드입니다. 이러한 관심사는 보통 어플리케이션의 여러 부분에 걸쳐 분산되어 있습니다. 예를 들어, 로깅, 트랜잭션 관리, 보안 등이 일반적인 관심사입니다. Aspect는 AOP에서 이러한 관심사를 추상화하고 모듈화하는 데 사용됩니다. Aspect는 어드바이스(Advice)와 포인트컷(Pointcut)을 결합하여 특정한 관심사를 정의하고 캡슐화합니다. 어드바이스는 관심사에 대한 구체적..
조회 대상 빈이 2개 이상일 때 해결 방법은 3가지가 있다. @Autowired 필드 명 매칭 @Qualifier => @Qualifier끼리 매칭 =>빈 이름 매칭 @Primary 사용 DiscountPolicy인터페이스를 구현한 rateDiscountPolicy와 fixDixcountPolicy가 있다고하자 @Autowired 필드 명 매칭 @Autowired private DiscountPolicy rateDiscountPolicy @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { @Autowired 는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름..
ArgumentResolver 스프링에서 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있다. HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute 같은 애노테이션 그리고 @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 매우 큰 유연함을 보여준다. 그럼 그걸 누가처리해줄까? 수많은 파라미터를 입맛에 맞게 누가 처리해줄까? 이렇게 다양한 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다. 애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter 는 바로 이 ArgumentResolver 를 호출해서 컨트롤러(핸들러)가 ..
스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련 된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다. 스프링 인터셉터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다. 스프링 MVC의 시작점이 디스패처 서블릿이라고 생각해보면 이해가 될 것이다. 스프링 인터셉터에도 URL 패턴을..
웹과 관련된 공통 관심사를 처리할 때 서블릿 필터를 사용한다. 예를 들어 로그인을 한 사용자만이 특정페이지에 접근을 할 수 있어야한다를 만족시키고싶을 때같은 경우이다. 필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터를 적용하면 필터가 호출 된 다음에 서블릿이 호출된다. 그래서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 된다. 참고로 필터는 특정 URL 패턴에 적용할 수 있다. /* 이라고 하면 모든 요청에 필터가 적용된다. 참고로 스프링을 사용하는 경우 여기서 말하는 서블릿은 스프링의 디스패처 서블릿으로 생각하면 된다. 필터체인 HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 필터3 -> 서블릿 -> 컨트롤러 필터는 체인으로 구성되는데, 중..
스프링 부트로 글로벌 설정 application.properties server.servlet.session.timeout=60 : 60초, 기본은 1800(30분) (글로벌 설정은 분 단위로 설정해야 한다. 60(1분), 120(2분), ...) 전체 세션에 대한 글로벌설정은 application.properties에서 위 코드로 시간을 설정해주면된다. (최소60) 위 코드대로라면 마지막요청 기준으로 세션을 60초 유지를 해주겠다는 뜻이다. 세션생성시점이 아니라 최근요청한 시간 기준으로의 시간이다.! 만약 전체 세션이 아니라 특정 세션 단위로 따로 설정을 하고 싶다면 java코드에서 직접 아래코드로 지정해주자. session.setMaxInactiveInterval(1800); //1800초
서블릿은 세션을 위해 HttpSession 이라는 기능을 제공하는데 전블로그에서 직접 구현한 세션의 개념이 이미 구현되어 있고, 더 잘 구현되어 있다. HttpSession 소개 서블릿이 제공하는 HttpSession 도 직접 만든 SessionManager 와 같은 방식으로 동작한다. 서블릿을 통해 HttpSession 을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다. Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05 @PostMapping("/login")//HTTP세션활용 public String loginV3(@Valid @ModelAttribute LoginForm form, Bindin..
쿠키를 사용해서 로그인Id를 전달해서 로그인을 유지할 수 있다. 그런데 이것은 심각한 보안 문제가 있다. 보안 문제 쿠키 값은 임의로 변경할 수 있다. 클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 되고 쿠키에 보관된 정보는 훔쳐갈 수 있다. 만약 쿠키에 개인정보나, 신용카드 정보가 있다면? 이 정보가 웹 브라우저에도 보관되고, 네트워크 요청마다 계속 클라이언트에서 서버로 전달된다. 쿠키의 정보가 나의 로컬 PC에서 털릴 수도 있고, 네트워크 전송 구간에서 털릴 수도 있다. 해커가 쿠키를 한번 훔쳐가면 평생 사용할 수 있다. 해커가 쿠키를 훔쳐가서 그 쿠키로 악의적인 요청을 계속 시도할 수 있다. 대안 쿠키에 중요한 값을 노출하지 않고, 사용자 별로 예측 불가능한 임의의 토큰(랜덤 값)을 노출하고, ..
스프링부트2.0부터는 기본적으로 Spring Boot의 데이터베이스와 관련된 스타터 의존성을 추가하면, 해당 스타터가 자동으로 필요한 라이브러리 및 구성을 가져오기 때문에 별도로 HikariCP를 명시적으로 추가할 필요가 없다. 스프링 스타터에서 패키지를 추가해 다운받아주자. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // 또는 implementation 'org.springframework.boot:spring-boot-starter-jdbc' } 이렇게 되어있을거다. 그럼 따로 설정할 필요없다. 없으면 의존성을 추가해주자. application.properties spring.datasour..