반응형

*  OncePerRequestFilter 를 상속한 커스텀 필터는 대체로 SecurityFilterChain에서 맨 앞쪽에 배치됨.

* 혹은 SecurityFilterChain에서 .addFilterBefore()나 .addFilterAfter 등으로 위치 지정 가능

* filterChain.doFilter(request, response)를 호출해야 다음 필터 또는 dispatcherServlet으로 전달됨

 

 

* JWT filter에서 예외가 발생하면 catch 로 잡아서 doFilter를 하여도 전의 corsfilter에서 달았던 cors 관련 헤더가 사라지는 현상 발생함

1. Request
2. CorsFilter (CORS 헤더 준비후에 filterChain.doFilter)
3. JwtFilter (JWT 토큰 검증하여 SecurityContextHolder세팅후  filterChain.doFilter)
4. UsernamePasswordAuthenticationFilter(앞에서 인증실패하여  SecurityContextHolder 없는 경우 username과 password로 세팅)

5. AuthenticationManager 에서 username 이 빈 문자열이면 BadCredentialsException 발생, 던짐

6. ExceptionTranslationFilter에서 AuthenticationException으로 잡힘

7. AuthenticationEntryPoint를 통해 처리되는 과정중 sendError 호출 -> 컨테이너가 응답을 새로 쓰는 과정에서 사라짐

sendError를 호출하게 되면 톰캣이 응답을 작성하기 때문에 Spring Security가 세팅해둔 cors 헤더나 json본문이 날아감.

 

 

@Component
@RequiredArgsConstructor
@Slf4j
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtService jwtService;
    private final Environment env;

    @Override
    protected void doFilterInternal(final HttpServletRequest request,
            @NotNull final HttpServletResponse response,
            @NotNull final FilterChain filterChain)
            throws ServletException, IOException {
        String accessToken = request.getHeader("Authorization");

        if (StringUtils.isNotEmpty(accessToken)) {
            try {
                Claims claim = jwtService.getClaims(accessToken);
                if (claim != null) {
                    //인증된 사용자로 설정
                    SecurityContextHolder.getContext().setAuthentication(jwtService.getAuthenticationFromClaim(claim));
                } else {
                    throw new IllegalArgumentException("Claims is null");
                }
            } catch (ExpiredJwtException e) {
                log.debug("TOKEN IS EXPIRED");
                setErrorCodeAndMessage(response, EXPIRED_TOKEN);
                return;
            } catch (Exception e) {
                log.debug("FAILED TO GET TOKEN INFORMATION.");
                setErrorCodeAndMessage(response, INVALID_TOKEN);
                return;
            }

        }

        filterChain.doFilter(request, response);
    }

    //token 관련 에러코드와 메세지를 응답에 세팅
    private void setErrorCodeAndMessage(HttpServletResponse response, ErrorCode errorCode) {
        try {
            TBResponse tbResponse = TBResponse.failed(errorCode);
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(tbResponse);

            if (!Arrays.asList(env.getActiveProfiles()).contains("prod")) {
                response.setContentType("application/json;charset=UTF-8");
                response.addHeader("Access-Control-Allow-Origin", "*");
            }
            response.addHeader("Access-Control-Allow-Credentials", "true");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
            response.addHeader("Access-Control-Allow-Headers",
                    "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization");
            response.addHeader("Access-Control-Expose-Headers",
                    "Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Content-Disposition");
            response.addIntHeader("Access-Control-Max-Age", 10);
            response.getWriter().write(json);

        } catch (Exception e) {
            log.warn("");
        }
    }
}

 

반응형
반응형

API로 서버에서 읽어오는 한글 텍스트가 자꾸 깨지는 거임..

Spring boot yml 파일에도 설정해보고 Tomcat 설정도 해봤는데 JVM 인코딩 설정하니 됐음..


tomcat 인코딩 설정

server.xml 설정

<Connector port="8080" URIEncoding="UTF-8" ... />

 

  • 적용 대상: 요청(Request)의 URL(쿼리 파라미터 등)
  • 예: /search?query=한글에서 query=한글 → 이 값을 Tomcat이 UTF-8로 해석함.
  • 주의: POST body의 form data나 JSON에는 적용되지 않음.

 

 

web.xml 설정

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

 

  • 적용 대상:
    • 요청 body 파라미터 인코딩 (POST, PUT form)
    • 응답 헤더의 Content-Type charset 설정
  • Spring Boot에서는 application.yml에서 아래로 대체 가능
spring:
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true

 


JVM 인코딩 설정

JVM 내부에서 기본 문자 인코딩으로 사용됨

톰캣경로/bin/setenv.sh 파일에 설정하였음

export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"

setenv.sh : Tomcat 실행 시 JVM 옵션이나 환경변수를 설정하는 스크립트

 

  • Java 표준 입출력(I/O) 기본 인코딩
    • 예를 들어 new InputStreamReader(someStream) 처럼 인코딩을 명시하지 않을 때 기본 인코딩으로 사용
    • 파일 입출력, 콘솔 출력, 로그 기록 등에서 기본 인코딩 기준이 됨
  • 애플리케이션이 명시적으로 인코딩을 지정하지 않은 경우의 문자열 처리
    • 예를 들어, new String(byteArray) 처럼 인코딩을 지정하지 않으면 JVM 기본 인코딩을 사용
  • 톰캣이나 스프링이 처리하기 전에 JVM 내부에서 문자 데이터를 다루는 기본 인코딩
    • 톰캣이나 스프링 필터 전에 JVM 레벨에서의 인코딩 기준 역할을 하므로, JVM 인코딩이 달라서 문제 발생하는 경우도 있음

 


서버 인코딩 확인

locale

 

 


요약

  • JVM 인코딩: 내부 기본 문자셋, 파일 I/O, 콘솔 출력 등에 영향
  • 톰캣 인코딩: URL 파라미터, 요청 처리 입출력 인코딩에 영향
  • 스프링 인코딩: HTTP 요청 바디, 응답 헤더에 인코딩 지정
  • 운영체제 로케일: JVM 기본 인코딩에 간접 영향
  • 클라이언트 인코딩: 요청 인코딩과 응답 처리에 직접 영향
반응형
반응형

며칠남았냐. ..
일하기싫다진짜

반응형
반응형

오늘은 면접을 두 군데나 봤어
취준은 2개월가량 걸린다더니
정말 알아보기 시작한지
2달정도 걸려서 면접을 보는구나
힘들다~

반응형
반응형

오늘은 면접준비
내일 오전반차
내일 오전면접보구
퇴근 후 또 면접~

반응형
반응형

오늘 홍대가서 잡템구경도하고
옷구경도 했다
무신사에서 엄청이쁜코트를 입어봤는데
코트 둘데가 없어서 안샀다
갖고싶다ㅠ


반응형
반응형

등촌 샤브샤브먹고
자라에서 블레이져 삼
생각보다 마니걸었다
힘틀당

반응형
반응형

1. Connection Timeout

발생 시점: 서버와 연결을 시도하는 과정에서 시간 초과 발생.

  1. 클라이언트가 서버에 연결 요청을 보냄 (CONNECT).
  2. 서버가 응답하지 않거나 네트워크 문제로 연결이 지연.
  3. Connection Timeout 설정 시간 초과 → ConnectTimeoutException 발생.

예시

 

  • 서버 주소가 잘못 설정되어 DNS 조회 실패.
  • 서버가 다운되어 요청을 처리하지 못함.
  • 방화벽이 연결을 차단.

 

 

 

2. Socket Timeout (응답 대기)

발생 시점: 연결이 성공한 후, 서버가 응답 데이터를 보내기 시작하지 않을 때 시간 초과 발생.

전체 응답 시간이 아닌 개별 패킷 응답 시간

  1. 클라이언트가 서버와 연결 성공.
  2. 서버는 요청을 받았으나 응답 처리가 지연됨.
  3. 클라이언트가 Socket Timeout 동안 대기했으나 데이터가 도착하지 않음 → SocketTimeoutException 발생.

예시

 

  • 서버 과부하로 응답 지연.
  • 요청 처리 중 서버의 작업이 중단됨.
  • 네트워크 패킷이 손실됨.

 

 

 

3. Read Timeout

발생 시점: 응답 데이터의 일부를 읽은 후, 남은 데이터를 끝까지 받지 못할 때 시간 초과 발생.

  1. 클라이언트가 서버와 연결 성공.
  2. 서버가 일부 응답 데이터를 보내기 시작.
  3. 응답 데이터의 나머지가 전송되지 않음.
  4. 클라이언트가 Read Timeout 동안 대기했으나 데이터 전송이 완료되지 않음 → SocketTimeoutException 발생.

예시

  • 대규모 데이터를 처리 중 네트워크 장애 발생.
  • 서버 응답이 중간에 중단됨.
  • 클라이언트가 데이터를 너무 빨리 읽으려 함.

 

 

SocketTimeout = ReadTimeout:

  • 두 용어는 Java에서 동일한 타임아웃 설정을 가리킵니다.
  • 둘 다 응답 데이터 읽기와 관련된 대기 시간을 제어합니다.
반응형
반응형

 

1. build.gradle에서는 bootJar만 활성화 되어있음 

 

2. 그래서 war 설정을 추가해주어야 함

war {
    enabled = true                // war 활성화
}
반응형

 

반응형
반응형

1. 오름차순 정렬

2. 배열 오른쪽부터 m개씩 끊으면 끊은 지점이 그 구간에서 제일 싼가격임..

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        Arrays.sort(score);
        int sum = 0;
        for (int i = score.length - m; i >= 0; i -= m) {
            sum += score[i] * m;
        }
        return sum;
    }
}
반응형

'코딩 관련 > 코딩문제풀기' 카테고리의 다른 글

[프로그래머스] Lv1. 소수 찾기  (0) 2024.11.16
[프로그래머스] Lv1. 덧칠하기  (0) 2024.11.15
[백준] 부분합  (0) 2024.11.14
[백준] 세 수 java  (0) 2024.11.14
[백준] 단지번호붙이기 java  (0) 2024.11.14

+ Recent posts