JSON Web Token의 약자로 전자서명 된 URL-safe (URL로 이용할 수 있는 문자로만 구성된)의 JSON
전자서명(Signature)은 JSON의 변조를 체크할 수 있게 되어 있다.
속성 정보(Claims)를 JSON 데이터 구조로 표현한 토큰으로 RFC 7519 표준
서버와 클라이언트 간 정보를 주고 받을 때 HttpRequest header에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증한다. 이때 사용되는 JSON 데이터는 URL-safe 하도록 URL에 포함할 수 있는 문자만으로 만든다.
HMAC 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key / Private Key 쌍으로 서명할 수 있다.
Base64 인코딩의 경우 "+", "/", "="이 포함되지만 JWT는 URI에서 파라미터로 사용할 수 있도록 URL-Safe 한 Base64url 인코딩을 사용한다.
2. JWT 구조
Claims를 userId, username으로 하고, JWA 알고리즘 SHA-256으로 암호화
서버는 클라이언트에서 요청을 받을 때 마다, 해당 토큰이 유효하고 인증되었는지 검증을 하고, 사용자가 요청한 작업에 권한이 있는지 확인하여 작업을 처리
서버에서는 사용자에 대한 세션을 유지할 필요가 없다. 즉, 사용자가 로그인되어 있는지 여부를 신경 쓸 필요가 없고, 사용자가 요청을 했을 때 토큰만 확인하면 되므로 세션 관리가 필요 없어서 서버 자원과 비용을 절감할 수 있다.
정보 교류
JWT는 두 개체 사이에서 안정정있게 정보를 교환하기에 좋은 방법
정보가 서명이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지 않았는지 검증을 할 수 있다.
* UI Layer, REST API 서버를 따로 두는 경우 JWT를 사용
* 하나의 End Point가 아닌 Mobile / Web 등의 multiple EndPoint 환경이라면 통합적인 인증 / 인가 환경을 제공하기 위해 JWT를 사용
* Third Party에게 public하게 open 한 REST EndPoing가 존재하는 경우 해당 Third Party의 인증 인가를 관리하기 위해 JWT 사용
Spring Security로 인한 접근 권한에 연관된 테스트는 Security 옵션이 필요
따라서 작성한 전체 테스트가 정상적으로 수행
Tasks -> verification -> test (전체 테스트)전체 테스트 확인
기존에 SpringSecurity 설정이 되어 있지 않은 상태에서 작성된 테스트 코드는 Security 적용 시 오류가 발생할 수 있다.
API 호출 및 페이지 접근 Controller 테스트 오류 해결하기
이슈 1. CustomOAuth2UserService를 찾을 수 없습니다.
CustomOAuth2UserService
소셜로그인 관련 설정값에 따른 실행
기본적으로 application.properties 파일을 src/main, src/test 모두 읽어서 사용한다.
src/test/resources에 application.properties가 없을 경우 src/main/resources에 있는 application.properties를 자동으로 읽는다.
src/main/resources/application-oauth.properties는 읽지 못한다.
즉, application-oauth.properties가 test쪽에 파일이 없기때문에 발생하는 오류이다.
해결책은 application.properties에 오류만 안나도록 설정 값을 임의로 넣는다.
test용 설정 파일
설정 파일은 application.yml로 작성하였다.
# server settingserver:port:8085# jpa settingspring:profiles:include:oauth# oauth 관련 properties 추가session:store-type:jdbch2:console:enabled:truejpa:show_sql:trueproperties:hibernate:dialect:org.hibernate.dialect.MySQL5InnoDBDialect# Test 용 security 설정security:oauth2:client:registration:google:client-id:testclient-secret:testscope:-profile-email
이슈 2. 302 Status Code
PostsAPIController 테스트
Spring Security 설정으로 인한 인증되지 않은 사용자의 요청으로 인해 리다이렉션 응답(302 status code)을 주게 된다.
이를 해결하기 위해서는 테스트 메서드에 임의로 인증된 사용자를 추가하여 API만 테스트 할 수 있도록 수정해야 한다.
SpringSecurity Test를 위한 spring-security-test 의존성 추가
네이버 로그인 URL은 application-oauth.yml에 등록한 redirect_uri_template 값에 맞춰서 자동으로 등록된다.
/oauth2/authorization/ 까지는 고정, 마지막 Path만 각 소셜 로그인 코드를 사용
naver가 마지막 Path가 된다.
{{>layout/header}}
<h1>스프링 부트로 시작하는 웹 서비스 No. 3</h1><divclass="col-md-12"><divclass="row"><divclass="col-md-6"><ahref="/posts/save"role="button"class="btn btn-primary">글 등록</a>
{{#userName}}
Logged in as: <spanid="user">{{userName}}</span><ahref="/logout"class="btn btn-info active"role="button">Logout</a>
{{/userName}}
{{^userName}}
<ahref="/oauth2/authorization/google"class="btn btn-success active"role="button">Google Login</a><ahref="/oauth2/authorization/naver"class="btn btn-secondary active"role="button">Naver Login</a>
{{/userName}}
</div></div><br><!-- 목록 출력 영역 --></div>
{{>layout/footer}}
네이버 로그인 확인
이슈
기존 설정된 application-oauth.yml 파일에 naver 설정을 추가하였더니 안됨