모든 글 201

스프링 시큐리티 기본 개념공부 8. (JWT 토큰의 개념과 사용 방법)

Section 9.JSESSIONID 에 관하여jsessionid는 로그인시 자동으로 생성되는 쿠키로, 해당 쿠키가 저장되면 다시 보안api 요청시 재 로그인이 필요없다.그러나 jsessionid는 작은 규모의 프로젝트에선 적합하지만 대규모의 프로젝트에서는 적합하지 않은데해당 토큰은 유저 데이터를 갖고 있지 않다. (무작위로 생성된 값이기 때문에 유저 데이터를 넣을 수 없다.)보안상 취약하여 브라우저에 저장된 해당 쿠키를 악용할 가능성이 높다.그렇기에 우리는 jsessionid 보다 더 나은 선택지를 찾아야한다.토큰이란 무엇인가?토큰이란 범용고유 식별자(UUID) 형식의 일반 문자열 또는 json web token 두 종류 중 하나이다.해당 토큰들은 엔드 유저의 인증 작업이 완료되는 로그인 작업 중 처음..

Spring Security 기본 개념 공부 7. (사용자 커스텀 필터 작성 방법)

Section 8.스프링 시큐리티 필터기본적으로 스프링 시큐리티엔 수많은 필터들이 정의 돼있다.그 필터들의 구조와 흐름을 알아야 적절한 위치에 적절한 로직을 지닌 커스텀 필터를 삽입할 수 있다.커스텀 필터 작성하는 방법커스텀 필터를 작성하기 위해서는 우선 Filter 인터페이스를 상속받아야한다.Filter 인터페이스를 상속받은 후 doFilter 메소드 내부에서 실행하고자하는 모든 로직을 정의하면 된다.doFilter 메소드의 인자로는 세가지가 있다.ServletRequest, 엔드유저로부터 오는 HTTP request이다.ServeletResponse, 엔드 유저에게 돌려보내는 HTTP response이다.filterChin, 필터들의 조합으로서 사용가능한 모든 필터로부터 다음 필터가 무엇인지 찾아내는..

Spring Security 기본 개념 공부 6. (권한 부여와 인증 방법)

Section 7.인증과 인가의 차이인증은 사용자가 api에 접근이 가능한 사용잔가 아닌가를 구별하는 것이다.인가란 권한부여로서 특정 api에 접근이 가능한 권한을 설정하여, 해당 권한이 있는 사람만 해당 api에 접근할 수 있도록 설정하는 것이다.항상 인증이 먼저 일어나고 그 이후에 인가가 발생한다.인증을 통해 로그인을 하고 어느 부분까지 접근할 수 있냐를 인가로 판단하는것이다.인증에서는 아이디, 비밀번호, OTP 등의 정보를 필요로한다.권한 부여에서는 자격증명관련 정보는 전혀 필요로 하지 않고, 역할이나 특권에 대한 정보만을 필요로한다.인증 실패는 401 에러코드가 뜨고, 권한이 없을 시엔 403 에러코드가 발생한다.유저의 권한과 역할이 저장되는 곳public interface GrantedAutho..

Spring Security 기본 개념공부 5. (Cors, Csrf란?)

Section 6. Cors란? Cross Origin Resource Sharing의 약자로 두 가지 이상의 다른 출처에서 자원을 공유한다는 의미이다. 두가지 이상의 다른 출처란 프론트와 백을 의미한다. 출처란 무엇일까?: http 프로토콜, 도메인주소(url), 포트번호의 조합을 출처라고 볼 수 있다. 셋중 하나라도 다르면 출처가 다르다로 할 수 있다. 이렇게 서로다른 출처에서 자원의 공유가 일어나면 최신 브라우저들은 모두 소통을 차단하도록 설정되어 있다. 그 이유는 이렇게 다른 출처에서 들어오는 요청을 차단함으로서 많은 보안적 이점을 가져갈 수 있기 때문이다. 그렇다면 우리는 웹을 개발할때 어떻게 해야할까? 첫 번째 방법은 @RestController 어노테이션 밑에 @CrossOrigin이라는 어..

백준 14889번 스타트와 링크 (java)

[Silver I] 스타트와 링크 - 14889문제 링크성능 요약메모리: 18120 KB, 시간: 348 ms분류백트래킹, 브루트포스 알고리즘제출 일자2024년 4월 7일 21:23:01문제 설명오늘은 스타트링크에 다니는 사람들이 모여서 축구를 해보려고 한다. 축구는 평일 오후에 하고 의무 참석도 아니다. 축구를 하기 위해 모인 사람은 총 N명이고 신기하게도 N은 짝수이다. 이제 N/2명으로 이루어진 스타트 팀과 링크 팀으로 사람들을 나눠야 한다.BOJ를 운영하는 회사 답게 사람에게 번호를 1부터 N까지로 배정했고, 아래와 같은 능력치를 조사했다. 능력치 Sij는 i번 사람과 j번 사람이 같은 팀에 속했을 때, 팀에 더해지는 능력치이다. 팀의 능력치는 팀에 속한 모든 쌍의 능력치 Sij의 합이다. Sij..

Spring Security 기본개념 공부 4.

Section 3. UserDetailsService 커스텀 이제 jdbcUserDetailsManager가 아닌 우리만의 로직으로 UserDetails를 정의해보겠다.! 우선 LoadUserByUsername 메소드를 직접 작성해야한다. 그러기 위해 데이터베이스에서 유저 정보를 가져와 UserDetails 객체로 만들어 반환해주는 로직을 작성해줘야한다. public class EazyBankUserDetails implements UserDetailsService { 다음과 같이 UserDetailsService를 구현하여 만든다. @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundExceptio..

백준 1182번 부분수열의 합 (java)

[Silver II] 부분수열의 합 - 1182 문제 링크 성능 요약 메모리: 14228 KB, 시간: 136 ms 분류 백트래킹, 브루트포스 알고리즘 제출 일자 2024년 3월 30일 17:40:34 문제 설명 N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다. 출력 첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다. 풀이 부분수열을 모두 찾고 부분수열의 합과 S값이..

Spring Security 기본개념 공부 3.

Section 3. 메모리에 유저 정보를 저장하는 첫 번째 방법 UserDetailsManager를 extends한 InMemoryUserDetailsManager클래스를 정의해주면 된다. @Bean public InMemoryUserDetailsManager userDetailsService(){ UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("12345") .authorities("admin") .build(); UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("12345") .authorities("re..

Spring Security의 기본개념 공부 2.

Section 2. Spring Security의 기본 설정 기본적으로 스프링 시큐리티는 모든 URL을 보호한다. SpringBootWebSecurityConfiguration 클래스를 살펴보자 @Bean @Order(2147483642) SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((requests) -> { ((AuthorizeHttpRequestsConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated(); }); http.formLogin(Customizer.withDefaults()); h..

Spring Security의 기본개념 공부 1.

Section 1. spring security를 써야하는 이유는 무엇일까? 보안 전문가들이 개발한 spring security를 사용함으로서 우리는 비즈니스 로직에만 집중할 수 있다. 최적화된 코드이기 때문에 최소한의 구성으로 웹 어플리케이션을 보호할 수 있다. 발전해가는 CSRF,CORS등의 취약점에 대비해 spring security팀은 항상 보안 코드를 업데이트 한다. 권한을 부여하여 접근을 제한할 수 있다. 다양한 방법으로 인증 및 인가를 구현할 수 있다. (JWT, OpenId등,, 추후에 배움) 서블릿과 필터 모든 웹사이트는 http 프로토콜을 사용하여 소통한다. 그러나 우리의 자바코드는 그러한 http 요청을 이해할 수 없기에 중재자가 필요하다. 이 중개자를 우리는 서블릿 컨테이너라고 부른..