-
Spring security JWT - 2. JWT token 발급하기Spring Security/jwt 2023. 11. 20. 18:42728x90
이 글은 Spring security - 2. UserDetailsService를 사용하여 로그인 구현 에서 작성한 코드를 바탕으로 추가 작성 함.
1. Build.gradle 작성
- 가장 최신 버전을 가져왔다. (https://jwt.io/libraries?language=Java 에 가보면 jjwt 말고 다른 jwt 라이브러리도 볼 수 있는다. 별 갯수를 보면 jjwt를 가장 많이 사용하는 것 같다.)
- 테스트를 위해 swagger 추가
2. Spring security 수정, application yml 추가
- 앞 글에서 적은 것 처럼 Session 방식이 아닌 Token을 만들어 Cookie에 저장 할 것이기 때문에 sessionCreationPolicy에서 STATELESS를 넣어 Session에 저장하지 않도록 한다.
- swagger를 사용할거라 requestMatchers에 swagger 도 담았다.
application.yml - yml파일에 jwt관련 설정을 넣는다.
- secret-key는 https://www.javainuse.com/jwtgenerator 사이트를 들어가면 알고리즘과 seed 값? 을 넣으면 자동으로 만들어준다.
https://www.javainuse.com/jwtgenerator
- issuer는 발급자인데, 꼭 필요하진 않다. 유효시간은 300으로 Configuration 파일에서 초로 변환하여 5분간만 유효하도록 설정하려고 한다.
3. 코딩
1. Token을 생성하기 위한 TokenProvider 작성
tokenProvider - yml에 설정한 값들을 value로 가져왔다.
- userEntity를 바탕으로 사용자 식별 정보를 뽑아 토큰을 만들었다.
- header도 설정 할 수 있는데, 기본으로 설정된다고 하는 것 같다.
- .header().add() 를 통해 수동으로 넣을 수 있다.
- issuedAt과 expiration 에서 LocalDateTime 이 아닌 다른 값을 받아서 해당 Wrapper타입으로 수정해야한다.
- SignatureAlgoritm이 Depercated 됐는데 저길 어떻게 수정하면 좋을지 나중에 찾아봐야겠다.
2. Service에서 로그인 관련 로직 작성
userService userEntity - Spring Security에서 제공하는 UserDetailsService를 상속받지 않고 이번엔 직접 로그인 로직을 구현하였다.
- entity에서 간단한 비밀번호 일치 로직을 넣었다.
3. Controller 작성
UserApiController - 기존 PostMapping으로 회원가입 API가 있어, signIn을 붙였다.
- 회원정보를 가져오기 때문에 GetMapping을 써도 되지 않나? 라고 생각될 수 있지만, GetMapping은 Body가 없고 parameter가 Query String으로 오기 때문에 보안에 취약하다.
- userService에서 로그인 관련 로직을 수행하고 tokenProvider에서 JWT토큰으로 변환한 다음 Cookie에 집어넣고 리턴한다.
- Cookie가 아닌 Body로 넣어 클라이언트가 입맛대로 저장해서 사용해도 되나, Body에 넣은 것도 XSS공격에 취약 할 수 있다고 한다.
4. 코드실행
swagger - 해당 API를 요청하면 응답헤더에 token 이라는 key값으로 JWT 데이터가 전달된다.
https://jwt.io/ - 해당 JWT를 Encoded에 넣으면 Decoded에 보이는 것처럼 HEADER와 PAYLOAD가 다 Decoded 되서 나온다.
- 그러므로 개인정보와 같은 중요한 정보를 담는것이 아닌, 식별 할 정보만 담아야 한다.
- 위 토큰을 탈취해서 exp 값을 수정하여 사용하려고 해도, 밑에 VERIFY SIGNATURE에 인코드 된 데이터와 값이 같지 않아 사용 할 수 없다.
728x90반응형LIST'Spring Security > jwt' 카테고리의 다른 글
Spring security JWT - 6. IUWT방식을 이용하여 방어하기 (0) 2023.12.03 Spring security JWT - 5. JWT토큰을 어디에 넣어 전달하는 것이 좋을까? (1) 2023.11.21 Spring security JWT - 4. RefreshToken으로 갱신하기 (1) 2023.11.20 Spring security JWT - 3. Token 검증하기 (1) 2023.11.20 Spring Security JWT - 1. JWT에 대해 (1) 2023.11.20