오랜만에 스프링 시큐리티 설정을 건드리는데 원래 쓰던 mvcMatchers 메소드가 가버렸다. Spring Security 5.8부터 antMatchers, mvcMatchers, and regexMatchers 가 deprecated되고 6부터는 사라질 예정이다. 위의 메소드 대신 새롭게 사용될 requestMatchers 메소드는 authorizeHttpRequests, authorizeRequests, CSRF configuration, WebSecurityCustomizer와 RequstMatcher 메서드가 있는 위치에 추가되었다. requestMatchers는 애플리케이션의 클래스 경로에 Spring MVC가 있는 경우 mvcRequestMatcher 구현을 선택하고 없는 경우 AntPathR..
UserDetails @Getter public class UserAccount extends User { private Account account; public UserAccount(Account account) { super(account.getNickname(), account.getPassword(), List.of(new SimpleGrantedAuthority("ROLE_USER"))); this.account = account; } } 해당 UserDetails를 Principal로 AuthenticationToken을 Security Context에 저장하고 Thyemleaf Extras를 통해 Security Context에 접근할 수 있다. View에서 Context 바로 접근 Con..
Security Context의 정보와 DB의 정보가 다를 때? Spring Security를 세션방식과 함께 이용한다면 로그인 시에 Security Context에 AuthenticationToken(UserDetails, Password, Granted)를 저장하고 세션이 만료되거나 로그아웃 될 때까지 전역적으로 사용할 수 있다. 하지만 로그인 중에 유저 정보가 변해도 Security Context가 들고있는 정보는 업데이트가 되지 않기 때문에 동기화를 시켜줘야한다. 코드 예시 유저 Entity와 Entity를 필드로 갖는 UserDetails를 정의한다. @Entity @Getter @EqualsAndHashCode(of = "id") @NoArgsConstructor public class Acc..
회원가입 시 이메일 인증 하는 이유 본인인증이 포함되어야 무차별적 회원가입을 막을 수 있다. 로그인, 이메일 인증 과 같이 인증 진행 중 실패시에 응답을 애매하게 줘야 하는 이유 너무 친절한 인증 실패 메세지는 공격자에게 힌트를 주는 것과 같다. PasswordEncoder 사용자가 회원가입할 때 제공하는 비밀번호를 평문으로 DB에 저장하면 절대 안되고 무조건 암호화 해야한다. Spring Security가 제공하는 PasswordEncoder를 통해 어떤 알고리즘을 사용해 암호화할지 정할 수 있다. 평소에 같은 평문을 암호화한 해쉬값이 맨날 달라진건 알았지만 왜 그런건진 몰랐는데 이는 솔트 때문이다. // BcryptPasswordEncoder @Override public String encode(C..