흰 스타렉스에서 내가 내리지

JWT 본문

web.etc

JWT

주씨. 2023. 2. 28. 19:22
728x90

JWT

JWT는 Header, Payload, Signature 3개의 부분으로 구성되어 있다.

Header : Signature를 해싱하기 위한 알고리즘 정보들이 담겨있다.

Payload : 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보에 대한 내용들을 담고 있다.

Signature : 토큰의 유효성 검증을 위한 문자열이다. 이 문자열을 통해 서버에서는 이 토큰이 유효한 토큰인지를 검증할 수 있다. 

 

JWT의 장단점 

장점 : 중앙의 인증서버, 데이터 스토어에 대한 의존성이 없고, 시스템 수평 확장에 유리하다.

단점 : Payload의 정보가 많아지면 네트워크 사용량이 증가하고, 이에 따라 데이터 설계 고려를 해야한다.

토큰이 클라이언트에 저장되므로 서버에서 클라이언트의 토큰을 조작할 수 없다. 

 

JWT 코드 시작

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-security'
   implementation 'org.springframework.boot:spring-boot-starter-validation'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'com.h2database:h2'
   annotationProcessor 'org.projectlombok:lombok'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   testImplementation 'org.springframework.security:spring-security-test'
}

새로운 프로젝트를 만들고, 아무 api 만들어서 요청을 해보면, 401 unauthorized 에러가 난다. 

@EnableWebSecurity  // 기본적인 Web 보안을 활성화 하겠다.
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception{
        httpSecurity
                .authorizeRequests()    // HttpServletRequest를 사용하는 요청들에 대한 접근제한을 하겠다
                .antMatchers("/api/hello").permitAll()  // 이 API에 대한 요청은 인증없이 접근을 허용하겠다.
                .anyRequest().authenticated();  // 나머지 요청들은 모두 인증되어야 한다
    }
}

이제 /api/hello 의 요청에 401 unauthorized는 뜨지 않는다. 

WebSecurityConfigurerAdapter는 deprecated 되었다. 나중에 이거 관련해서도 수정해보자.