전 직장을 다니고 있을 때 사내에서는 애플리케이션 모듈이 모두 분리되고, 모바일 어플도 추가돼서 Auth 서버가 만들어졌었다.
즉, 4개로 분리된 웹 애플리케이션과 모바일 애플리케이션이 공통된 인증이나 권한 관리가 필요하여 만들어진 것이다.
이 때 토큰 방식으로 인증을 진행하였는데, 이유는 아래와 같다.
이처럼 여러가지 이유를 통해 Auth 서버를 따로 구축하고, 인증 토큰 방식을 사용하였고 토큰의 종류는 OAuth 2.0 프로토콜에서 주로 사용되는 JWT Token을 사용하였다.
나머지의 디테일한 내용들은 이전에 사내 세미나를 진행하면서 준비했었던 자료를 참고하면 좋을 것 같다.
마침 ATDD 과정에서도 Github를 연동한 로그인 기능을 미션을 줘서 잊고 있었던 개념들을 다시 한번 일깨우는 경험이었다.
위의 글에서도 정리가 되어있지만, 한번 더 간략하게 인증 방식과 인증을 이용한 테스트 작성 방법을 정리해보겠다.
form()
form 로그인 진행 후 받은 세션 ID를 쿠키에 담아서 다음 요청을 진행함
.auth().form(email, password, new FormAuthConfig("/login/session", "email", "password")
.when().get("/members/me")
preemptive()
.auth().preemptive().basic(email, password)
.when().get("/members/me")
.auth().oauth2()
vs .header(”Authorization”, “Bearer “ + accessToken)
.auth().oauth2(accessToken)
.when().get("/members/me")
// or
.header("Authorization", "Bearer " + 로그인_사용자.getAccessToken())
RequestSpecBuilder()
를 통해서 인수 테스트의 세팅을 공통적으로 사용하고 싶을 때는 .addHheader()
를 통해 세팅해주면 됨https://stackoverflow.com/questions/55090014/how-to-re-use-oauth2-token-in-rest-assured-test-cases
return new RequestSpecBuilder()
.setAccept(MediaType.APPLICATION_JSON_VALUE)
.setContentType(MediaType.APPLICATION_JSON_VALUE)
.addHeader(HttpHeaders.AUTHORIZATION, AUTH_TYPE_OAUTH + Access_Token))
.build();
given()
을 사용하는 경우에는 .auth().oauth2()
사용실제 Github 요청처럼 외부 환경에 의존하는 테스트는 크게 3가지로 진행
@ElementCollection
, @CollectionTable
값 타입의 라이프 사이클은 엔티티를 따라간다
CollectionTable
name
: 값 타입을 저장할 별도의 테이블 명joinColumns
: 참조할 fk 컬럼명 (보통 소속된 엔티티의 pk값)@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
name = "MEMBER_ROLE", // 값 타입 용 별도 테이블 명
joinColumns = @JoinColumn(name = "id", referencedColumnName = "id") // id랑 fk
)
@Column(name = "role")
private List<String> roles;