본문 바로가기

전체 글

(225)
[백준] 2295. 세 수의 합 https://www.acmicpc.net/problem/2295 2295번: 세 수의 합 우리가 x번째 수, y번째 수, z번째 수를 더해서 k번째 수를 만들었다라고 하자. 위의 예제에서 2+3+5=10의 경우는 x, y, z, k가 차례로 1, 2, 3, 4가 되며, 최적해의 경우는 2, 3, 4, 5가 된다. k번째 수가 최 www.acmicpc.net a + b + c = d에서 가장 큰 d의 값을 찾는 문제이다. 주 포인트는 a + b = d - c로 생각해야 한다. 즉, 이중 반복문으로 a + b의 모음들을 만들고, 이분 탐색으로 d - c가 a + b 모음들에 포함되나 확인하면 된다. 그런데 이때 d - c의 값이 a + b의 모음에 포함되나 확인할 때, ArrayList.contain() ..
OAuth를 통한 인증 OAuth의 정의 OAuth는 사용자가 특정 서비스를 사용할 때 아이디, 패스워드 등의 사용자 정보를 입력하며 회원가입을 할 필요 없이, 신뢰할 수 있는 외부 어플리케이션(ex, 카카오, 네이버, 구글)에 등록된 사용자 정보를 통해 외부 어플리케이션에서 대신 인증을 처리해주는 방식이다. 만약 OAuth를 사용하지 않으면, 사용자가 매 사이트마다 회원가입을 진행하며 사용자 정보를 노출해야 한다. 그러나 OAuth를 사용하면 사용자 정보를 특정 외부 어플리케이션에서만 관리하고 인증을 처리해준다. 따라서 사용자가 사용자 정보를 다른 서비스에 노출하지 않아도 된다. 동작 원리 용어는 다음과 같다. Resource Owner: 인증을 수행하는 주체(Resource Sercer의 계정을 소유하고 있는 사용자) Cl..
JWT JWT는 Json Web Token의 약자로 토큰의 한 종류이다. JWT는 마침표를 기준으로 헤더, 페이로드, 서명으로 나뉜다. 헤더(Header) 암호화 알고리즘 및 토큰 타입에 대한 정보를 담고 있다. 페이로드(Payload) 사용자 정보, 토큰 만료 시간 등의 claim 정보를 담고 있다. claim은 key-value 형태로 구성되어 있으며, 페이로드에 여러 개의 claim을 담을 수 있다. 페이로드는 서명된 파트가 아니므로 누구나 디코딩하여 데이터 열람이 가능하다. 따라서 패스워드 같은 중요한 데이터는 페이로드에 담으면 안된다. 서명(Signature) 헤더와 페이로드를 암호화 알고리즘으로 서명한 결과이다. JWT의 보안 문제 기존 Access Token의 한계 Access Token만 사용했을..
프로젝트 중 SpringSecurity 필터 체인에서 발생한 예외를 처리한 방법 JwtException 예외 처리 방법SpringSecurity 필터 체인에 JWT를 검증하는 JwtAuthenticationFilter를 두었다. 그리고 JWT가 유효하지 않을 경우, JwtException이 발생한다.방법 1. JwtExceptionFilterJwtAuthenticationFilter 앞단에 JwtException을 처리하는 JwtExceptionFilter를 두었다. 따라서 JwtAuthenticationFilter에서 JwtException가 발생하면 예외가 JwtExceptionFilter로 넘어와서 이 곳에서 예외 응답을 한다.문제점그런데 이 방법에서 의도치 않은 문제가 발생했다. 인증이 필요하지 않은, 즉 JWT가 필요하지 않은 URL 요청의 경우 SpringSecurity의..
SecurityFilterChain에 필터를 등록할 때 주의할 점(WAS의 FilterChain과 Spring Security의 SecurityFilterChain의 차이) SecurityFilterChain은 여러 개 존재할 수 있다. 그리고 경로에 따라 다른 SecurityFilterChain을 거치도록 할 수 있다. 예를 들어 위의 그림처럼 /api/** 경로에 대한 SecurityFilterChain과 나머지 경로(/**) 에 대한 SecurityFilterChain을 다르게 설정하면, 각 경로에 따라 서로 다른 필터 체인을 통과하게 된다. WAS의 FilterChain에 필터를 등록하는 방법 필터를 스프링 빈으로 등록하는 방법은 여러가지가 있는데 대표적으로 다음 두 방법이 있다. Filter 인터페이스를 구현하고, @Component를 붙여서 필터를 등록하는 방법 @Configuration을 붙인 설정 정보 클래스를 만들고, 내부에 FilterRegistration..
permitAll 설정의 의미 우리는 다음과 같이 permitAll을 통해 인증 정보 없이 누구나 접근 가능한 리소스를 지정할 수 있다. @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authHttp -> authHttp.requestMatchers(POST, "/join", "/login").permitAll()) ... return http.build(); } 그러나 커스텀 필터와 함께 permitAll을 사용할 때는 주의할 점이 있다. permitAll() 설정 유무에 대한 차이를 명확히 알아야 하는데, permitAll에 대해 공식 문서에는 다음과 같이 나와있다. ..
Spring Security의 예외 처리 방식 ExceptionTranslationFilter Spring Security는 ExceptionTranslationFilter를 통해 인증 예외(AuthenticationException)와 인가 예외(AccessDeniedException)를 적절하게 처리하고 원하는 형태의 HTTP 응답을 줄 수 있다. ExceptionTranslationFilter는 다음과 같이 SecurityFilterChain에 속해 있는 필터 중 하나로, 실행 흐름은 다음과 같다. ExceptionTranslationFilter는 FilterChain.doFilter(request, response)를 통해 이어진 필터들을 호출한다. 만약 AuthenticationException이 발생한 경우, 다음을 실행한다. Securi..
Spring Security의 인가(Authorization) Spring Security의 인가 인가는 인증된 사용자가 특정 리소스에 접근이 가능한지를 결정하는 과정이다. Spring Security에서의 인가는 인증 정보를 담은 Authentication의 authorities(역할)을 통해 접근이 가능한지를 결정한다. Spring Security는 인증을 위한 필터로 AuthorizationFilter를 제공한다. AuthorizationFilter를 사용하려면, 다음과 같이 authorizeHttpRequests() 메소드를 통해 등록하면 된다. @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(au..