전체 글 554

[Spring Security][KoLiving] 4. JWT 토큰 기반 인증

* 이전 포스팅에서 다루었던 JWT 토큰 설명을 참고해주세요 인증 시스템을 개발하면서 사용해야 할 기술을 정하는 중에 세션과 토큰 두개의 선택지가 있었습니다. 장점 단점 세션 - 서버에서 사용자 세션을 제어할 수 있다 - 서버에서 사용자 세션 관리를 위한 자원소모가 크다. - 세션 유지로 인해 서버의 확장성에 제약이 생길 수 있다. 토큰 - 서버의 확장성에 제약이 없다. - 플랫폼간의 인증방식을 일관되게 관리할 수 있다. - 여러 서비스간의 통합 인증이 용이하다. - 토큰이 탈취되면 클라이언트의 연결을 제어할 수 없다. - 사용자 세션을 제어할 수 없다 저희는 '토큰' 기반으로 인증을 구현하기로 결정하였습니다. '토큰' 기반의 장점과 단점을 고려하여 시스템 구현 방향을 설정하였습니다. KoLiving은 ..

[JWT] 2. AccessToken과 RefreshToken

1. AccessToken권한 토큰보안 리소스를 접근하고자 하는 유저에게 부여사용자 정의 클레임을 두어 사용할 수 있습니다. (IP 등) 유효기간보안상 을 짧은 시간으로 설정 (1시간)공격자에 의해 노출되더라도 오랜시간 사용하지 못하게 하기 위함입니다.만료 시, 재요청이 필요합니다 (만료되면 효과가 없습니다.) 2. RefreshToken권한 토큰 갱신AccessToken이 만료될 때, 새로운 AccessToken을 요청하기 위한 토큰입니다. 유효기간AccessToken과 다르게 긴 유효시간을 가집니다. 사용자 경험 향상주기적인 AccessToken 발급에 대한 사용자 인증 요청을 줄일 수 있음AccessToken이 만료되면, 클라이언트는 새로운 AccessToken을 받기위해 인증서버에 새로운 요청을..

[JWT] 1. JWT Token

1. JWTJSON 형식의 토큰 표준입니다. (RFC 7519)URL의 일부 혹은 HTTP 헤더에 포함시켜 토큰을 전달합니다. 특징경량성간결하고 크기가 작음제약된 환경에서 정보를 간단하게 전달하는데 사용됨 보안성서명된 토큰무결성 보장: 정보가 위조되지 않았음을 검증할 수 있음Algorithm: HMAC, RSA 데이터 암호화 가능 (민감데이터 보호) 자급자족필요한 정보를 자체적으로 포함하고 있음서버측에서 별도의 상태를 유지할 필요가 없음서버는 토큰의 클레임 정보를 통해 별도의 데이터베이스 조회 없이 요청을 처리할 수 있음 2. 구성{ { "alg": "HS256", "typ": "JWT" }, { "sub": "1234567890", "name": "Jo..

[Spring Security] 3-4. 인증: 로그아웃

1. 로그아웃 아키텍쳐 Spring Security는 기본적으로 로그아웃 기능을 지원합니다. 기본 URI로 GET /logout, POST /logout가 있습니다. GET /logout : 로그아웃 확인 페이지를 보여줍니다 POST /logout : 로그아웃에 필요한 CSRF Token을 제공합니다. POST /logout 로 요청할 경우, 여러 LogoutHandler가 동작하여 작업합니다. SecurityContextLogoutHandler가 HTTP Session을 무효화 합니다. SecurityContextLogoutHandler가 SecurityContextHolderStrategy를 비웁니다. SecurityContextLogoutHandler가 SecurityContextRepository..

[Spring Security] 3-3. 인증: 패스워드 저장소

1. Password Storage Spring Security는 비밀번호를 안전하게 저장하기 위해 단방향 변환만 지원합니다. 입력 패스워드를 테이블에 저장된 해시 비밀번호와 비교하는데 유용합니다. Password 보안 기술 발전과정 초기 보안 처리의 문제점 초기에는 데이터베이스의 접근제어 기능에 의존하여 보안을 처리하였으며, 패스워드를 평문으로 저장하였습니다. 그러나 악의적인 공격자들의 공격으로 인해 아이디 - 패스워드 정보가 탈취되는 위험을 내포하고 있었습니다. 입력값을 악용한 공격이 생겨났습니다. (SQL Injection) 단방향 해싱의 도입 데이터베이스에 패스워드를 단방향 해싱하여 저장하도록 권장받았습니다. 단방향 해싱 값은 노출되더라도 원본을 알아내는 것이 매우 어렵습니다. 비선형 연산, 혼돈..

[Spring Security] 3-2. 인증: 아이디 / 패스워드

1. 인증 정보 습득방식 Spring Security는 기본적으로 클라이언트로부터 인증 정보를 얻기 위한 세가지 방법을 지원합니다. 기본 인증 방식은 HttpServletRequest 객체로부터 아이디 패스워드 정보를 얻습니다. Form Basic Digest 2. 비밀번호 저장소 (Password Storage) UserDetails UserDetails는 Spring Security에서 유저의 정보를 나타내는 인터페이스입니다. 사용자가 로그인 요청을 할 경우, DaoAuthenticationProvider는 UserDetailsService를 통해 사용자의 정보를 조회합니다. UserDetailsService에 의해 UserDetails 인터페이스의 구현체가 반환됩니다. UserDetails 구현체의..

[Programmers] 더 맵게

난이도 : Level 2 문제링크 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶다. 이를 위해 가장 스코빌 지수가 낮은 두개의 음식을 섞어 새로운 음식을 만든다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞는다 섞어야 하는 최소 횟수를 리턴하라 해설 1. 최소힙을 사용하여 가장 스코빌 지수가 낮은 음식 두개를 꺼냅니다. PriorityQueue pq = new PriorityQueue(); for (int s : scoville) { pq.add(s); } while (pq.size() > 1 && pq.peek() < K) { int min = pq.poll(); ..

Algorithm/(Java) PS 2023.10.01

[Programmers] H-Index

난이도 : Level 2 문제링크 H-Index : 논문 n편 중, h번 이상 인용된 논문이 h편 이상,나머지 논문이 h번 이하 인용시, h의 최댓값 논문의 인용 횟수를 담은 배열이 주어질 때, H-Index를 리턴하라 해설 1. H-Index 의 범위는 1 ~ 전체 논문수 입니다. 2. H가 가장 큰 숫자부터 작은수까지 조건을 만족하는지 확인합니다. public int solution(int[] citations) { int answer = 0, size = citations.length; Arrays.sort(citations); for (int i = 0; i = h) { return h; } } return..

Algorithm/(Java) PS 2023.10.01

[Programmers] 이중우선순위큐

난이도 : Level 3 문제링크 이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다. I 숫자 : 큐에 주어진 숫자를 삽입합니다. D 1 : 큐에서 최댓값을 삭제합니다. D -1 : 큐에서 최솟값을 삭제합니다. 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 리턴 비어있지 않으면 [최댓값, 최솟값] 리턴 해설 1. 두개의 우선순위 큐 사용하기 - 최대힙, 최소힙 PriorityQueue minPq = new PriorityQueue(); PriorityQueue maxPq = new PriorityQueue(Comparator.reverseOrder()); 최소힙 - 최솟값을 항상 루트로 두는 힙 자료구조 최대힙 - 최댓값을 항상 루트로 두는 힙 자료구조 2. 삽입 for (String ..

Algorithm/(Java) PS 2023.10.01

[Programmers] 디스크 컨트롤러

난이도 : Level 3 문제링크 하드디스크는 한번에 하나의 작업만 수행할 수 있습니다. 각 작업의 요청시간-소요시간을 담은 2차원 배열 jobs가 주어진다. 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리할 때의 평균값을 리턴하라 해설 출처에서 공부한 내용을 정리했습니다 1. 변수 선언하기 int cnt = 0; int idx = 0; int end = 0; cnt : 처리된 작업의 수 idx : 현재 처리한 작업의 인덱스 end : 현재 처리한 작업의 종료시간 2. 요청시간이 빠른 순으로 처리하고, 우선순위 큐로 다음 처리할 작업 정하기 Arrays.sort(jobs, (a, b) -> a[0] - b[0]); PriorityQueue pq = new PriorityQueue(..

Algorithm/(Java) PS 2023.09.30