인프런 커뮤니티 질문&답변

b0i4s님의 프로필 이미지
b0i4s

작성한 질문수

코드로 배우는 React with 스프링부트 API서버

jwt 토큰 security에 관하여...

작성

·

393

0

jwt를 사용하는 이유가 무상태의 장점 때문인 것으로 알고 있습니다.

그리고 Security의 경우 세션을 기본적으로 생성하는데 jwt 토큰을 발급한 이후에는 세션이 생기지 않도록 설정하신 것 같습니다.

그렇다면 궁금한 점이 있습니다.

  1. 세션을 통해서 로그인 사용자를 인증하는 것이 Spring Security의 장점 중 하나라고 생각하는데 세션을 생성하지 않으면 결국 Spring Security를 사용하는 이유가 없지 않나 싶습니다.

  2. 강사님께서는 아래와 같이 하시지 않았지만 아래와 같이 UserDetail의 아래 메서드들을 true를 두게 되면 인증이 되는 것이기 때문에 세션이 유지된다고 생각하는데 그렇다면 굳이 세션을 유지하면서 JWT를 사용하는 경우도 발생하는 건가요?

  3. 결국 궁금한 점은 무상태를 위해 JWT를 사용하는데 굳이 Spring Security를 사용하는 이유가 궁금합니다.

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}

답변 1

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

네.. 일반적으로 스프링 시큐리티가 세션을 기반으로 하기 때문에 굳이 무상태에서는 필요하지 않다라고 보실 수 도 있습니다. 이것은 '스프링 Web Security'의 기능만이 널리 강조되어서라고 생각합니다.

 

예를 들어 https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/authentication/AuthenticationProvider.html 를 보면 스프링 시큐리티가 얼마나 다양한 방식의 인증을 처리할 수 있는지를 보여주는데요.. 이런 이유는 스프링 시큐리티가 원래 웹 뿐이 아니라 다양한 통신과정에서 사용되기 위해서 설계되었기 때문이라고 생각합니다(예를 들어 조직별 상세한 접근 제한을 구현한다면 너무 끔찍하지만 시큐리티는 지원합니다.). 다만 책의 예제의 경우 OAuth2와 같은 표준 방식이 아닌지라.. 스프링 시큐리티의 기능대신 직접 구현하는 부분이 많긴 합니다.

 

두번째 질문은 말씀하신대로 username과 패스워드가 맞다면 인증에는 성공하겠지만, 세션 유지와는 무관합니다. 세션 정책은 Web Application이나 WAS의 정책을 따라서 동작하기 때문입니다.

JWT는 말씀하신대로 정말 알 수 없는 미지의 상대와 통신할 때 사용하기 위한 방식인 만큼 세션과 같이 병행되는 경우는 거의 없다고 봐야하지 않을까요?(개인적으로 한번도 그런 요구를 받아 본 적은 없습니다.) 다양한 디바이스와 기술로 통신하기 위한 수단이라.. 모바일 앱이 세션을 유지하는 건 이상하죠..

 

마지막 질문은 확장의 가능성이라고 말씀드리고 싶습니다. 예를 들어 AuthentiactionProvider만을 구현해서 추가하면 자신이 원하는 방식의 인증 체계를 구현할 수도 있죠..

 

스프링 시큐리티를 곰곰히 생각해 보시면 생각보다 인터페이스를 구현해야 하는 일이 많다는 것을 아시게 됩니다. 이것은 스프링 MVC와는 좀 반대 방향인데요(점점 많은 것을 Annotation만으로 처리하니까요.). 이렇게 되는 이유는 시큐리티가 이미 다양한 인증 방식을 지원하는 루트를 만들어 두었고, 개발자들이 그에 맞는 구현을 추가하기만 하면 되는 방식이라는 것을 의미합니다.

 

장황하게 적기는 했는데요.. 'JWT만 쓸거고 무상태만 한다'고 가정했을 때 '스프링 시큐리티'가 필수인가? 라고 물어보신다면.. '아니요'라고 말씀드리는게 맞긴 합니다. 하지만 그렇게 보면 '서블릿'을 이용해서 구현할 수도 있는데 스프링 MVC를 굳이 쓸 이유가 없는거와 좀 비슷하지 않을까요?

 

 

 

 

 

 

 

 

b0i4s님의 프로필 이미지
b0i4s

작성한 질문수

질문하기