JWT를 활용한 인증키 발급
JWT(Json Web Token) 기술을 이용하여 인증키를 발급받고 인증키를 이용해서 인증처리를 진행하는 기능을 개발한다.
JWT는 Json 포맷을 이용하여 사용자에 대한 정보를 관리하는 Web Token 이다.
인증처리 과정
- 클라이언트가 API 사용을 위해 인증키 발급 요청
- 인증키가 이미 생성되어 있는지 account DB 테이블에서 조회
- 인증키가 존재할 경우 인증키 정보를 조회하고 없다면 JWT를 새로 생성하여 account DB 테이블에 저장
- 인증키 정보를 클라이언트에 전달
- 발급받은 토큰 값을 item 등록 요청하면서 HTTP Header 값에 JWT 값을 함께 전송
- Gateway Server에서 Header에 들어온 JWT 값을 가지고 account 테이블에서 조회해서 존재하는 인증키인지 검증
- 인증키가 조회되지 않으면 클라이언트로 로그인 실패 에러메세지 전송. 인증키가 조회되면 item-service로 이동
JWT
토큰 안에 Header, Payload, Signature 값이 합쳐져 있다.
- Header: 어떤 암호화 방식이 사용되었는지 정보
- Payload: 어떤 데이터에 대한 토큰을 의미하는지 정보
- Signature: 암호화 기법을 사용하여 Header와 Payload를 암호화 키와 함께 암호화된 값
Authentication Server 생성
모듈 생성
의존성 추가
build.gradle 필요 의존성 추가
DTO 추가
ResponseDTO에 token 값이 null일 들어갈 수 있는데 response에 출력되지 않게 하기위해 @JsonInclude 어노테이션을 사용하였다.
도메인 추가
Repository 추가
서비스 추가
계정 조회 함수와 계정 정보를 저장하는 메서드를 구현하였다.
saveAccount 메서드는 아이디와 비밀번호 요청이 들어오면 새로 ACCOUNT 테이블에 등록이 되고 이미 요청받은 아이디와 비밀번호라면 ACCOUNT 정보가 업데이트 된다.
클라이언트 첫 saveAccount 메서드로 요청이오면 회원가입을 위해 사용하는 용도로 호출하는데 이 때는 token 값을 null로 요청한다.
토큰 발급 요청시에도 saveAccount 메서드를 호출하는데 이 땐 토큰을 생성하고 token 파라미터에 값을 담아 기존에 등록된 account 정보에 token 값만 업데이트 되도록 한다.
계정 조회 용도인 selectAccount 메서드는 계정 정보를 등록하던, 토큰 발급 요청을 하던 회원 존재유무 체크를 위해 사용한다.
회원 등록 API, 토큰 발급요청 API 개발을 위한 컨트롤러 추가
회원 등록 API인 join uri로 요청시 account가 존재하는지 조회 후 이미 존재한다면 코드 100 에러를 반환하고 없을 경우 회원 등록을 진행한 후 코드 200을 반환한다.
토큰 요청 API인 token uri로 요청시 account가 존재하는지 먼저 조회 후 account가 없으면 코드 101 에러를 반환한다.
회원이 존재한다면 getToken 메서드로 JWT 토큰을 생성하고 token 값을 account 정보와 함께 업데이트 하고 responseDTO에 생성한 token 값을 담아 200 코드와 함께 응답받을 수 있다.
JWT 토큰을 생성하는 Uril 클래스
- withSubject: 토큰명
- withExpiresAt: 토큰 유효기간
- withIssueAt: 토큰 발행일
- sign: 토큰 암호화 알고리즘 설정
config-server, eureka-server 연동
resources 폴더에 application.properties 파일을 bootstrap.yml 파일로 변경한다.
config-server에 authentication-server-local.yml 파일을 추가한다.
이 때 item-service 쪽 yml 파일과 authentication-server-local yml 파일에 spring datasource와 jpa 설정이 중복되어 하나의 파일에서 관리하기 위해 Database 접속 관련 설정은 따로 분리시킨다.
config-server에 datasource-local.yml 파일 생성
authentication-server-local.yml 인텔리제이 문제인가 인식이 안되어서 파일 경로로 설정하였다.
각각 설정을 import 하여 datasource-local.yml 파일을 불러온다.
config-server 시작
eureka-server 시작
authentication-server 시작
Postman 으로 http://localhost:8900/v1/account/join uri로 회원 등록 테스트 후 성공 메세지
다시 요청하면 이미 등록된 유저라고 응답이 온다.
등록한 아이디, 비밀번호로 http://localhost:8900/v1/account/token 토큰 요청시 토큰을 생성하여 준다.
Java 마이크로서비스(MSA) 프로젝트 실습 강의 - 인프런
Java SpringCloud와 여러 오픈소스를 연동하여 마이크로서비스를 구축하는 세미 프로젝트를 경험해보실 수 있습니다. 마이크로서비스 구축 경험을 해보고 싶으시다면 이 강의를 추천할게요!, 마이
www.inflearn.com