Jwt/Jwt 토큰만들기

Springboot Jwt 토큰만들기!(1) with securiy

디비드킴 2021. 7. 16. 19:04

새 토이 프로젝트를 만들기 전

이전까지는 다른 인증 시스템을 만들고 싶었다

그러던 중 jwt 토큰을 발견했었고 

너무 멋있었다 

다중 서버+리프레쉬 토큰 db저장

우와... 무조건 해보고 싶었다

 

그래서 3일 동안

시도했고 성공했다! 

시작해 보자!

 

이분의 강의를 보고 도전해봤다!

https://www.youtube.com/watch?v=cv6syIv-8eo&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=12 

 

1. 의존성 주입

implementation group: 'com.auth0', name: 'java-jwt', version: '3.18.1'

https://mvnrepository.com/artifact/com.auth0/java-jwt/3.18.1

참 유용하고 좋은 사이트이다!

 

2.jwtService 만들기

jwtservice.java

의존성 주입 후

jwt가 제공해 주는 기능이다

 

토큰 이름

withSubject("jwtToken")

내토 큰 이름은 "jwtToken"

 

토큰 유효시간

withExpiresAt(new Date(System.currentTimeMillis()+1000))

현재시간 +1초이다(1000=1초)

 

토큰에 담길 정보

.withClaim("id",id)

사용자 회원가입 시 id값을

넣어주려고 한다 email로 사용해도 된다!

 

토큰 암호화 알고리즘

.withClaim("id",id).sign(Algorithm.HMAC512("kim"));

상용했고 

서명은 kim이다

서버만 알고 있어야 하는 고유의 값이다!

 

3. 회원정보 넣어두기

임의의 회원을 넣어두었다

 

4. 시큐리티 설정

security.java

인증방식이 다르다

인증/권한이 필요한 사이트에 

접근할 때마다 유저가 토큰을 던져

그때그때마다 db에서 정보를 꺼내와서

정보를 가져온다

 

기존 시큐리티 세션 정책 해제

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

폼로그인 해제

.formLogin().disable()

httpbasic해제

 .httpBasic().disable()

더 이상 브라우저에서 id/pwd를 헤더에 들고 오지 않고

대신 로그인 시 발급된 토큰을 들고 오게 한다!

 

요청 발생

.authorizeRequests()

허용 링크

 .antMatchers("/","/auth/**","/login")////이 링크들은

 .permitAll()///허용한다

권한 확인 링크

. antMatchers("/api/v1/user/**")

.access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGE') or hasRole('ROLE_ADMIN')")

.antMatchers("/api/v1/manage/**")

.access("hasRole('ROLE_MANAGE') or hasRole('ROLE_ADMIN')")

.antMatchers("/api/v1/admin/**")

.access("hasRole('ROLE_ADMIN')")

그 외는 인증이 필요하다

.anyRequest()///그외 다른 요청운

.authenticated();//인증이있어야한다(로그인) 

 

4. 로그인 필터 만들기

 

이제 시큐리티 정책이 꺼져서 

로그인 필터를 만들어줘야 한다!

 

jwtLoginFilter

jwtLoginFilter.java

/login으로 온 링크는 

UsernamePasswordAuthenticationFilter를 탄다

 

시큐리티가 들고 있다

attemptAuthentication

 

json을 dto로 바꾼다

 ObjectMapper objectMapper=new ObjectMapper();

 userDto userDto=objectMapper.readValue(request.getInputStream(), userDto.class);

 

리턴 타입이 authentication이다

Authentication authentication=jwtService.getAuthentication(userDto);

 

4-2 .getAuthentication(userDto)만들기

 

따로 만들 예정이다 이유는

naver/kakao다 필요해서이다!

 

jwtService

jwtService.java

authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(dto.getEmail(),dto.getPwd(),principaldetail.getAuthorities()));

이 코드는

public UserDetails loadUserByUsername(String username)

실행시킨다고 한다

 

5. 로그인 성공 시 토큰 생성

jwtLoginFilter.java

시큐리티가 들고 있다

성공시successfulAuthentication로 자동으로 온다

 

토큰을 만들어서 

헤더에 담는다

 String jwtToken=jwtService.getJwtToken(principaldetail.getUserDto().getId());

 response.setHeader("Authorization""Bearer "+jwtToken); 

 

6. 시큐리티에 필터 걸기

security.java

결과

postman을 사용해보자

postman

 

vscode

 

성공적이다 

 

브라우저에서 확인하는 법

이걸로 사실상 3일 날린 거다

서버에서 requst.getheader를 아무리 해도

안 나와서 뭐지 왜 안담 기지 했는데

 

알고 보니 

브라우저에서 확인하면 되는 거다...

 

js

브라우저

검사-> 네트워크-> doDo작동-> 파일 생김-> 클릭

와우

알아서 잘 오고 있었다 

이걸 확인하려고 며칠 고생한 거 같다....

 

 

+추가

시큐리티세션에 담아줘야하는데 그걸안했다

 

service

jwtService.java

jwtLoginFilter

jwtLoginFilter.java

 

 

jwtService.setSecuritySession(authentication);를 추가해준다