SpringSecurity에서 formLogin 방식은 기본적으로 제공하는데 apiKey로그인 방식은 제공하지 않는다.
그 이유는 뭘까? 단순하다. SpringSecurity에서 아직 개발되지 않았다.
그래서 이를 위해서는 개발자의 custom 코드가 필요한것이다.
현재 우리가 만든 apiKey를 활용한 인증 방식에 대해서 SpringSecurty에게 알려줘야한다.
setLogin()을 활용해 인증 토큰을 발급했다. 이후에 SpringSecurty는 인증 토큰이 유효한지만 판단하면 된다.
// 스프링 시큐리티가 이해하는 방식으로 강제 로그인 처리
// 임시함수
public void setLogin(String username) {
UserDetails user = new User(
username,
"",
List.of()
);
Authentication authentication = new UsernamePasswordAuthenticationToken(
user,
user.getPassword(),
user.getAuthorities()
);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
배경) 로그인이 현재 유효한지 확인하기 위해 DB를 1번 이상 조회(SELECT * FROM MEMBER WHERE apikey=? ) 해야한다.
만약, 이런 요청이 100번 발생했다면 쿼리문도 100번 수행된다. 조금 더 가벼운 인증방식이 있으면 좋을 것 같다.
그래도 여전히 API KEY를 사용하기도 한다.
JWT 토큰 방식 사용하는 이유 ) 해당 토큰이 유효한지 확인하기 위해 DB조회가 필요하지 않다.
JWT는 암호화된 결과물이 아니다. base64 decoding을 하면 원문이 바로 나온다.
그럼 시크릿키가 왜 필요할까? 위조되었는지 내부적으로 확인하기 위함이다.
잘못된 시크릿키를 입력하면 위조되었는지 빠르게 파악이 가능하다.
긴 원문을 가지고 그안의 규칙을 파악하는 것이 어렵기 때문에 암호화된 결과물이 아니어도 된다?