Spring/Spring Security

스프링 프레임워크에 관한 내용을 기록합니다.
00. 상황JWT 인증 방식에서 Access Token의 취약한 부분을 보완하기 위해 Refresh Token을 추가로 사용한다.이때 Refresh Token은 비교적 안전하지만, 긴 생명 주기를 가지기 때문에 한번 탈취될 경우를 대비하여 서버에서 직접 관리를 할 필요가 있다.이를 위해 내가 진행중인 프로젝트에서는 Refresh Entity를 정의하여, 토큰이 발급될 때마다 DB에 저장하는데, 이때 만료된 토큰이 제거되지 않고 계속 쌓이는 문제점을 발견했다.이를 해결하기 위해 스케줄러를 사용하여, 자동으로 만료된 Refresh Token을 제거하는 로직을 도입했다.01. 스케줄러 사용법스케줄러 사용법은 간단하다.1. Application.java@SpringBootApplication@EnableJpaA..
지난번 JWT를 구현한 과정에 이어서 Refresh Token을 사용하여 더욱 강화된 JWT를 구현해보고자 한다.만약 JWT에 대한 기본 구현 방법을 모른다면 해당 글을 읽기 이전에 이전에 작성한 글을 먼저 읽어보길 추천한다.아래에 작성된 예제 코드도 위 링크의 코드를 기반으로 작성했음을 유의하자.먼저 Refresh Token이 왜 필요한지를 먼저 알아보자01. Refresh Token의 필요성과 장단점기존 Access Token만을 사용한 인증 방식의 문제점물론 지난번에 구현한 기초적인 jwt만으로도 간편하게 클라이언트의 요청에 다한 인가 작업을 처리할 수 있다.하지만 jwt 방식에는 큰 문제가 하나 있다.그것은 바로 jwt 토큰이 탈취되었을 경우 어떻게 대처할 것인가?에 관련된 문제이다.다들 알다시피..
이번에는 스프링부트에서 JWT를 활용한 인증 방식을 구현해보고자 한다.이때 Spring Security의 필터단에 JWT를 사용하는 커스텀 필터를 끼워넣어 구현하고자 한다.JWT의 구조에 관한 글은 이전에 작성한 글을 참고하자.그럼 바로 시작하겠다.01. 전체 동작 과정JWT를 구현하는 코드를 설명하기 전에 먼저 Spring Security를 활용하여 JWT를 동작시키는 과정을 살펴보고자 한다.하나씩 살펴보자회원가입 과정회원가입은 기존 회원가입과 다르지 않게, DTO로 회원가입 정보를 전달받으면 Controller가 이를 Service에 전달 이후 비즈니스 로직을 실행한다.위 그림에는 나오지 않지만 회원 정보를 저장할때 비밀번호를 암호화 하여 저장하는 부분만 유의하자.최초인증(로그인) 과정원래 스프링 시..
세션 방식에서의 최초 인증(로그인) 과정이미지 출처UsernamePasswordAuthenticationFilter의 내부를 살펴보기 전에 먼저, 세션 방식에서의 인증 과정을 살펴보자.먼저 클라이언트의 로그인 요청이 들어오면 UsernamePasswordAuthenticationFilter필터(위 이미지의 AuthenticationFilter)에서 요청을 가로챈다.***(1)AuthenticationFilter에서는 클라이언트 요청에 담긴 인증 정보를 가지고 UsernamePasswordAuthenticationToken 객체를 생성한다.(2)그렇게 생성한 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 넘겨주면서 인증 과정을 Authentic..
Spring Security를 사용하여 웹 상에서의 인증/인가 작업을 구현할 때는 세션-쿠키 기반의 인증 방식을 사용한다.하지만 이러한 인증 방식에는 몇가지 단점이 존재한다.이러한 단점을 보완하는 인증 방식으로 JWT 인증 방식이 존재한다.이때 JWT가 어떻게 사용되고 왜 필요한지 한번 살펴보자✨ JWT의 개념과 필요성세션-쿠키 기반 인증 방식의 한계세션-쿠키 기반 인증 방식에서는 클라이언트의 세션 정보를 서버의 DB에 저장한다.이 경우 클라이언트의 매 요청마다 DB를 참조해야 하므로 인증 과정이 길어진다.서비스가 확장되어 클라이언트의 수가 많아질 경우, 그만큼 서버에 저장되는 세션 정보도 많아짐으로 서버의 부담도 증가한다.세션-쿠키 인증 방식의 경우, 클라이언트는 발급받은 토큰 아이디를 쿠키에 저장한다..
유저별로 표시할 내용이 달라야 하는 경우, 페이지를 리턴하기 전에 먼저 로그인한 유저가 누구인지 알아야 할 필요가 있다.스프링부트에서는 Controller단에서 로그인된 유저를 얻을 수 있도록 @AuthenticationPrincipal 아노테이션을 지원한다.사용 예시@PostMapping("/diary/write") public String postDiaryWrite(@AuthenticationPrincipal User user, DiaryDto.CreateDiaryDto diaryDto){ diaryService.createDiaryWithUserid(diaryDto,user.getUser_id()); return "redirect:/today"; } 컨트롤러 단에..
Im_Hayden
'Spring/Spring Security' 카테고리의 글 목록