[Java_SpringBoot] JWT

5w31892p·2023년 1월 11일
0

Spring

목록 보기
24/30

:: JWT

  • JSON 객체 사용해 토큰 자체에 정보를 저장하고 있는 Web Token

:: JWT 구성

  1. Header
    • Signature 해싱하기 위한 알고리즘 정보
  2. Payload
    • 서버와 클라이언트가 주고받는 시스템에서 실 사영될 정보에 대한 내용
  3. Signature
    • token의 유효성 검증을 위한 문자열
    • 문자열을 통해 서버에서 유효한 토큰인지 검증 가능

:: JWT 장점

  1. 중앙의 인증서버와 데이터 스토어에 대한 의존성 없어 시스템 수평 확장 유리
  2. Base64 URL Safe Encoding 사용으로 URL, Cookie, Header 어디에서든 사용 가능

:: JWT 단점

  1. Payload의 정보가 많아지면 트래픽 사용량 증가로 데이터 설계의 고려 필요
  2. 토큰이 각 클라이언트에 저장되기 때문에 서버에서 각 클라이언트 토큰 조작 불가

:: Security

:: 401 Unauthorized 해결

  1. 라이브러리 설치 후 controller 생성 후 실행 → 401 Unauthorized 발생
설치 라이브러리
- lombok
- security
- spring-web
- jpa
- h2
- validation
  1. config패키지와 SecurityConfig 파일 생성
  • @EnableMethodSecurity : 기본적인 Web 보안 활성화 기능
    • 외에 추가적인 설정을 위한 두가지 방법
      1. WebSecurityConfigurer를 implements
      2. WebSecurityConfigurerAdapter를 extends
  1. SpringSecurity 5.7 부터 WebSecurityConfigurerAdapter 지원 안함
    • 취소선 생김
    • 해결 방법 → spring.io
      @Bean
      public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
      	http
      		.authorizeHttpRequests() // httpservletrequest 사용하는 요청에 접근 제한 설정하겠다는 의미
             .requestMatchers(new AntPathRequestMatcher("/**")).permitAll() 
      		.and()
      		.csrf().ignoringRequestMatchers(
      				new AntPathRequestMatcher("/h2-console/**"))
      		.and()
      		.headers()
      		.addHeaderWriter(new XFrameOptionsHeaderWriter(
      				XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
      	;
      	return http.build();

:: JWT Tutorial 설정

  • application.properties 파일명 변경
    • application.yml
      ( yaml 파일이 보기 편해서 변경 )
  • hibernate : JPA 구현체
  • create-drop
    • SessionFectory 시작될 때 Drop, Create, Alter
    • 종료될 때 Drop
spring:
  h2:
    console:
      enabled: true
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:

  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        format_sql: true
        show_sql: true
logging:
  level:
    com.example: DEBUG

:: JWT 추가 설정 및 코드 구현

  • HS512 알고리즘 사용은 SecretKey 64byte 이상 설정
  • token-validity-in-seconds : 토큰 만료시간, 초단위
jwt:
  header: Authorization
  secret:  c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK
  token-validity-in-seconds: 86400
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

TokenProvider

  • InitializingBean 을 implements 한 후 afterPropertiesSet을 오버라이드
    • 빈 생성 후 주입받은 후에 시크릿값을 BASE64 decode 해서 key 변수에 할당하기 위해
  • Authentication 객체의 권한 정보 이용해 토큰 생성
  • 토큰에 담겨있는 정보를 통해 Authentication 객체를 리턴
    • 토큰을 이용해 클레임 만든 후 이를 이용해 유저 객체 생성 후
    • token, principal(유저객체), authorities(권한정보)를 만들어 Authentication를 리턴
  • 토큰 유효성 검증
    • 토큰 파싱 후 발생하는 Exception 캐치

JwtFliter

  • GenericFilterBean extends 후 doFilter 오버라이드
    • 실제 필터 로직은 doFilter에 작성
  • doFilter는 토큰의 인증정보를 SecurityContext에 저장하는 역할
  • Header에서 토큰 정보 꺼내오기 위한 메소드 추가

JwtSecurityConfig

  • TokenProvider 와 JwtFliter 를 SecurityConfig에 적용하는 역할
  • SecurityConfigurerAdapter 을 extends 후
  • TokenProvider 주입받아
  • JwtFilter를 통해 Security로직에 필터 등록

JwtAuthenticationEntryPoint

  • 유효한 자격증명 제공하지 않고 접근하려 할 때 401 Unauthorized 에러 리턴

JwtAccessDeniedHandler

  • 권한이 존재하지 않는 경우 403 Forbidden 에러 리턴

:: Security 설정 추가

  • 위 5개 클래스 SecurityConfig에 적용

Security 설정 추가 중 에러 발생 -> 내일 해결 후 꼭 정리

0개의 댓글