Rlog

Postman 헤더로 세션 로그인하기 본문

Web

Postman 헤더로 세션 로그인하기

dev_roach 2021. 12. 28. 22:32
728x90

오늘 회사에서 Admin 페이지를 만들던 도중에 무조건 Spring Security 를 통한 로그인을 거쳐야만 API 호출이 가능한 경우가 있었다.

그래서 최초에 보안 인증 페이지에서 로그인을 하고 거기서 취득한 인증 쿠키를 이용해 API call 을 해야만 했는데..

이게 Postman 에서 어떻게 계속 쿠키를 이어받아서 쓸 수 있을까를 고민하다가 

포스트맨의 Script 를 통해서 해결할 수 있다는 것을 알았다.

 

사실 Token 을 쓰는 대부분의 경우도 Token 을 어떻게 쉽게 모든 API 에서 계속해서 사용할까를 고민할텐데

그에 대한 해답이 될수도 있다.

 

백문이 불여일타... 코드로 한번 보도록 하자.

@RestController
public class AuthController {

    @PostMapping("/api/auth")
    public void auth(@RequestParam("username") String username,
                     @RequestParam("password") String password,
                     HttpServletRequest httpServletRequest,
                     HttpServletResponse httpServletResponse) {

        HttpSession session = httpServletRequest.getSession();

        Member member = new Member(username, password);
        session.setAttribute("member", member);

        Cookie authCookie = new Cookie("AUTH", member.getUsername());

        httpServletResponse.addCookie(authCookie);
    }

    @GetMapping("/api/profiles")
    public Member getUsers(@CookieValue(value = "AUTH", required = true) Cookie authCookie, HttpServletRequest httpServletRequest) {
        HttpSession session = httpServletRequest.getSession();

        hasUser(authCookie);

        Member member = (Member) session.getAttribute("member");

        return member;
    }

    private void hasUser(Cookie cookie) {
        if (cookie == null) {
            throw new RuntimeException("세션에 유저가 존재하지 않습니다.");
        }
    }

}

이제 이걸 포스트맨에 적는다고 해보자.

인증 API 의 경우 이렇게 될것이고

Profiles 의 경우 계속해서 Cookie 값이 필요할 것이다.

만약에 여기서 토큰 값을 "AUTH" : "roach" 를 계속 복사해서 쿠기값으로 API 에 넣어준다면 귀찮고 유지보수에 힘들것이다.

아래 API 를 한번 보자.

계속해서 위와 같이 Cookie 에 AUTH 를 반복해서 적어야 하는 일이 반복될 것이다.

만약 Authrization 토큰을 쓰는 경우도 Bearer "${Token}" 이런식으로 계속 도배가 될 것이다.

그리고 토큰 값이 변경될때마다 계속해서 값을 변경해줘야 할것이다.

 

이걸 유지보수에 쉽게 쓰는 법을 한번 생각해보자.

일단 포스트맨에는 아래처럼 Environment 라는 Global 혹은 Stage 마다 이용할 수 있는 변수가 존재한다.

이 처럼 DEV Stage 에서 사용할 수 있는 Environment 를 생성해보았다.

이걸 사용하는 방법은 {{AUTH}} 요런식으로 사용하면 된다.

아래 예시를 한번보자.

이렇게 사용할 수 있다.

이제 Environment 의 initial value, current value 만 변경하면 쉽게 변경할 수 있을 것 처럼 느껴진다.

하지만 이것또한 계속해서 Environment 에 들어가서 변경해줘야 한다는 단점이 있다.

 

개발자는 자동화를 시켜야 하므로 한번 자동화 시킬 방법을 찾아보자.

Postman 에는 pre-request 와 test script 가 존재한다.

 

간단하게 설명하면 진행되는 순서는 아래와 같다

pre-request - postman real-request(이게 진짜 우리가 쓰는 리퀘스트) - test script 순으로 진행된다.

일단 가볍게 스프링의 Interceptor 와 비슷하다고 생각하면 된다.

또는 NodeJS 의 Middleware 구조를 한번 생각하면 편하다.

 

그래서 test script 에서는 postman real-request 의 response 에 대한 값을 참조가 가능하다.

아래 코드를 한번 보자.

현재 포스트맨이 지니고 있는(has) 쿠키를 확인해보자.

console.log(pm.cookies.get("AUTH)) 를 통해서 현재 쿠키를 확인해보자.

우리가 계속해서 지급받아야 하는 값은 저 쿠키값이다.

 

그래서 포스트맨에서는 변수값을 설정하는 기능이 존재하는데

pm.environment.set("key", "value) 로 설정이 가능하다.

우리가 Environment 에서 Cookie : "AUTH={{AUTH}}" 요런식으로 사용하기로 했어서 AUTH 변수를 변경해줘야한다.

 

pm.environment.set("AUTH", authToken);

 

요걸 적용해 보고 한번 environment 에 적용이 되는지 확인해보자.

이제 다른 API 에서도 잘 사용되는 모습이다.

만약 Bearer Token 을 쓰고 있다해도 쉽게 적용가능한 모델이니까 한번 사용해보길 바란다.

이제 앞으로 생기는 API 의 Headers 에 Cookie 에 AUTH={{AUTH}} 만 적용해준다면 쉽게 사용이 가능하다.

'Web' 카테고리의 다른 글

Spring Request Body Binding 파헤쳐보기  (0) 2022.01.02
OpenAPI 3.0  (0) 2021.11.12