새 토이 프로젝트를 만들기 전
이전까지는 다른 인증 시스템을 만들고 싶었다
그러던 중 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 만들기
의존성 주입 후
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. 시큐리티 설정
인증방식이 다르다
인증/권한이 필요한 사이트에
접근할 때마다 유저가 토큰을 던져
그때그때마다 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
/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
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(dto.getEmail(),dto.getPwd(),principaldetail.getAuthorities()));
이 코드는
public UserDetails loadUserByUsername(String username)
실행시킨다고 한다
5. 로그인 성공 시 토큰 생성
시큐리티가 들고 있다
성공시successfulAuthentication로 자동으로 온다
토큰을 만들어서
헤더에 담는다
String jwtToken=jwtService.getJwtToken(principaldetail.getUserDto().getId());
response.setHeader("Authorization", "Bearer "+jwtToken);
6. 시큐리티에 필터 걸기
결과
postman을 사용해보자
성공적이다
브라우저에서 확인하는 법
이걸로 사실상 3일 날린 거다
서버에서 requst.getheader를 아무리 해도
안 나와서 뭐지 왜 안담 기지 했는데
알고 보니
브라우저에서 확인하면 되는 거다...
js
브라우저
검사-> 네트워크-> doDo작동-> 파일 생김-> 클릭
와우
알아서 잘 오고 있었다
이걸 확인하려고 며칠 고생한 거 같다....
+추가
시큐리티세션에 담아줘야하는데 그걸안했다
service
jwtLoginFilter
jwtService.setSecuritySession(authentication);를 추가해준다
'Jwt > Jwt 토큰만들기' 카테고리의 다른 글
springboot jwt token 발급하기 2 (0) | 2022.01.01 |
---|---|
springboot jwt 발급하기 1 (corsFilter) (0) | 2022.01.01 |
Spring boot jwt토큰만들기!(2) with security (0) | 2021.07.16 |
Springboot Jwt 토큰 발급전 셋팅! (0) | 2021.07.16 |