TODO
- 알고리즘
- [ ] sql 3문제 풀기
- Spring
- [ ] spring security 복습, 파고들기
복기
인증 인가
인증 : 해당 유저가 실질적으로 존재하는 유저인지 증명하는것
인가 : 어떠한 리소스에 접근을 하려고 할 때 접근이 가능한지 확인 하는 것.
Session vs JWT
- 세션 : DB에 저장됨
- JWT : 서버에 저장되지 않고 클라이언트가 토큰을 가지고 있음.
Util
- Util 클래스란 특정 매개 변수(파라미터)에 대한 작업을 수행하는 메서드들이 존재하는 클래스
- 다른 객체에 의존하지 않고 하나의 모듈로서 동작하는 클래스
JWT
JWT 생성 순서
1. JWT 생성
- JWT의 subject에 사용자의 식별값(ID)를 넣습니다.
- 사용자의 권한 정보를 JWT에 넣습니다. Key-Value 형식으로 key를 통해 확인할 수 있습니다.
- 토큰 만료 시간을 넣습니다. (ms 기준)
- issuedAt에 발급일을 넣습니다.
- signWith에 secretKey 값을 담고 있는 key와 암호화 알고리즘을 넣어줍니다.
- key와 암호화 알고리즘을 사용하여 JWT를 암호화합니다.
2. JWT Cookie에 저장
3. 받아온 Cookie의 Value인 JWT 토큰 substring
- StringUtils.hasText를 사용하여 공백, null을 확인하고 startsWith을 사용하여 토큰의 시작값이 Bearer이 맞는지 확인합니다.
- 맞다면 순수 JWT를 반환하기 위해 substring을 사용하여 Bearer을 잘라냅니다.
4. JWT 검증
- JWT의 구조 중 Payload 부분에는 토큰에 담긴 정보가 들어있습니다.
- 여기에 담긴 정보의 한 '조각'을 클레임(claim)이라고 부르고, 이는 key-value의 한 쌍으로 이뤄져있습니다.
- Jwts.parserBuilder()와 secretKey를 사용하여 JWT의 Claims를 가져와 담겨 있는 사용자의 정보를 사용합니다.
UserDetails, UserDetailsService
- userDetails
- Spring Security에서 사용자의 정보를 담는 인터페이스이다.
- method

- userDetailsService
- Spring Security에서 유저의 정보를 가져오는 인터페이스이다.
- method

UsernamePasswordAuthenticationFilter
- 사용자가 로그인을 시도하면,
UsernamePasswordAuthenticationFilter가 사용자명과 비밀번호를 추출하여 UsernamePasswordAuthenticationToken을 생성합니다.
UsernamePasswordAuthenticationFilter는 생성된 토큰을 AuthenticationManager 에게 전달합니다.
AuthenticationManager 는 등록된 AuthenticationProvider들을 순회하면서 적절한 프로바이더를 찾고, 해당 프로바이더를 통해 실제 인증을 수행합니다.
DaoAuthenticationProvider는 UserDetailsService를 사용하여 주어진 사용자명을 기반으로 사용자 정보를 조회하고, 인증이 성공하면 새로운 Authentication 객체를 생성하여 반환합니다.
- 반환된
Authentication 객체는 인증이 완료된 상태로 다시 UsernamePasswordAuthenticationFilter에게 전달되어 인증된 사용자에 대한 추가 처리를 수행하고, 성공 또는 실패에 따른 적절한 동작을 수행합니다.