Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

JAN's History

JWT Basic, Bearer 인증 방식 본문

JWT

JWT Basic, Bearer 인증 방식

JANNNNNN 2024. 7. 1. 14:33

Session은 동일 도메인에서만 가능하다

  • 만약 동일한 도메인에서의 요청이 아니라면, 쿠키가 날라가지 않는다(서버에서 쿠키가 거부하기 때문)
  • 그렇다면 javascript에서 Ajax로 헤더에 쿠키를 강제로 담아 보낼 수 있는데, 서버에서는 HTTP Only 설정을 통해 HTTP 요청이 아닌 javascript 요청이 들어오면 거부되는 설정을 한다.
  • HTTP only = false로 풀어주면, 외부에서 javascript로 강제로 쿠키에 세션 ID를 담아 보내는 등의 악질적인 장난을 많이 치기 때문에 true로 설정하는 편이 좋다.

Authorization

서버로 요청을 보낼 때, 요청 헤더에 Authorizaion : <type> <credentials>을 담아서 보냅니다.

type에는 여러가지가 있지만 Basic, Bearer를 알아보겠습니다.

Basic

사용자 ID와 PW를 Base64로 인코딩한 값을 토큰을 사용한다.

  • Basic 토큰 값이 노출되면 ID와 PW를 그대로 노출시키는 것이 되기 때문에 보안에 취약하다.

Bearer

일반적으로 JWT같은 OAuth 토큰을 사용한다.

  • Basic 방식과는 달리, 토큰에 ID, PW를 넣지 않는다
  • 로그인 시 토큰을 부여받고 이후 요청할 때 헤더에 토큰을 실어 보내는 방식이다.
  • 토큰 값이 노출되어도 토큰 유효시간이 있기 때문에 Basic보다 보안에 강하다.

 

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    protected final CorsFilter corsFilter;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //세션 없는 상태로 만들겠다.
        .and()
                .addFilter(corsFilter) //@CrossOrigin는 인증이 없을때만 사용 가능함!, 인증이 필요할 땐 필터에 등록해야한다
                .formLogin().disable()
                .httpBasic().disable()
                .authorizeRequests()
                .antMatchers("/api/v1/user/**")
                .access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/api/v1/manager/**")
                .access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/api/v1/admin/**")
                .access("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll();
    }
}

➡️그래서 JWT를 사용할 때에는 SecurityConfig에서 httpBasic방식을 disable해야한다!