본문 바로가기
카테고리 없음

프론트엔드) simple jwt를 사용한 회원가입/탈퇴 구현 코드 해설

by abccoco 2022. 7. 1.

저번 글에 이어 jwt를 활용한 회원가입 탈퇴 코드 해설에서

프론트엔드 코드들을 살펴보도록 하자

각 코드에 대한 해설은 주석으로 확인 할 수 있다.

 

api.js

  • url 설정

가장 먼저 url 을 손쉽게 변경하기 쉽도록 편의를 위해 변수안에 base url을 넣어준다.

# api.js
const backend_base_url = "http://127.0.0.1:8000"
const frontend_base_url = "http://127.0.0.1:5500"

* 프로트의 base_url을 프론트 settings.py 하단에 추가해 준다

# 백엔드 settings.py 하단.
CORS_ALLOWED_ORIGINS = [
    "http://localhost:5500",
    "http://127.0.0.1:5500",
]

 

  • 로그인 기능
# api.js
async function handleSignup() {
    const signupData = {
        // getElementById 를 사용해 fullname, username, password 데이터를 가져온다.
        fullname: document.getElementById('floatingInputFullname').value,
        username: document.getElementById("floatingInput").value,
        password: document.getElementById('floatingPassword').value,
    }
    // 가져온 데이터를 fetch를 사용해 해당 url의 headers 에 json 방식으로 넘겨운다.
    const response = await fetch(`${backend_base_url}/user/`, {
        headers: {
            // 어떤 type으로 데이터를 보내줄지 선택한다.
            Accept: "application/json",
            'Content-type': 'application/json'
        },
        method: 'POST',
        //  body 에는 프론트에서 가져온 signupData 를
        // stringify 를 사용해 자바스크립트의 값을 JSON 문자열로 변환한다.
        body: JSON.stringify(signupData)
    }
    )
    // response 한 데이터 또한 json 화 해주어야 한다. url에 await 걸어준것 처럼 await 를 걸어준다.
    response_json = await response.json()

    if (response.status == 200) {
        alert('회원 가입 성공')
        window.location.reload();
    } else {
        alert('다시 입력해 주세요')
    }
}

 

  • 회원가입 기능
# api.js
async function handleSignin() {
    const loginData = {
        username: document.getElementById("floatingInputSignIn").value,
        password: document.getElementById('floatingPasswordSignIn').value
    }
    // /user/api/token/ 은 백엔드에서 jwt url이다. 모르겠다면,
    // 백엔드) 회원가입 / 탈퇴 기능 구현 글 참조.
    const response = await fetch(`${backend_base_url}/user/api/token/`, {
        headers: {
            Accept: "application/json",
            'Content-type': 'application/json'
        },
        method: 'POST',
        body: JSON.stringify(loginData)
    }
    )
    response_json = await response.json()
    if (response.status == 200) {
        // response_json.access, response_json.refresh 의 데이터를 각각
        // localStorage 에 access, refresh 라는 이름으로 저장한다.
        localStorage.setItem("access", response_json.access)
        localStorage.setItem("refresh", response_json.refresh)
        // access 값 파싱 작업 / 가공 작업
        // jwt 는 .으로 3가지의 값이 나우어져 있다. split('.') 을 사용해 1번째의 값을 파싱해준다.
        const base64Url = response_json.access.split('.')[1];
        const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
        const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
        // 파싱해서 바뀐 값이 저장 되어있는 jsonPayload 를 localStorage 에 payload 라는 이름으로 저장한다.
        localStorage.setItem("payload", jsonPayload);
        alert("로그인 성공")
        window.location.replace(`${frontend_base_url}/`);
    } else {
        alert("일치하지 않는 아이디나 비밀번호입니다.")
    }
}

 

이렇게 jwt 를 사용한 로그인 회원가입 기능 구현이 모두 완료되었다.


 

* 번외로 회원가입 / 로그인 html 코드도 참고용으로 남기겠다.

                <!-- 로그인 -->
                <div class="sign-in-htm margin-top-20">
                    <div class="group">
                        <label for="user" class="label">Username</label>
                        <input type="text" class="input" id="floatingInputSignIn" placeholder="username">
                    </div>
                    <div class="group">
                        <label for="pass" class="label">Password</label>
                        <input type="password" class="input" data-type="password" id="floatingPasswordSignIn"
                            placeholder="Password">
                    </div>
                    <div class="group">
                        <input type="submit" id="login" class="button margin-top-40" value="Sign In" onclick="handleSignin(), login()">
                    </div>
                </div>


                <!-- 회원가입 -->
                <div class="sign-up-htm margin-top-20">
                    <div class="group">
                        <label for="user" class="label">Fullname</label>
                        <input type="text" class="input" id="floatingInputFullname" placeholder="Fullname">
                    </div>
                    <div class="group">
                        <label for="pass" class="label">Username</label>
                        <input type="text" class="input" id="floatingInput" placeholder="Username">
                    </div>
                    <div class="group">
                        <label for="pass" class="label">Password</label>
                        <input type="password" data-type="password" class="input" id="floatingPassword"
                            placeholder="Password">
                    </div>
                    <div class="group">
                        <input type="submit" class="button margin-top-20" value="Sign Up" onclick="handleSignup()">
                    </div>
                </div>
            </div>
        </div>
    </div>

댓글