무지개곰
article thumbnail

목차

DB에 user 정보가 기록되지 않던 문제 해결 과정

로그인 과정 수정

로그아웃

결과


DB에 user 정보가 기록되지 않던 문제 해결 과정

문제 해결을 위한 시도

  • Test를 추가한 결과 DB에 User 정보 저장 실패
func TestGetUserInfo_and_Save(t *testing.T) {
    setupTestDB()
    defer teardownTestDB()
    err := godotenv.Load("./../.env")
    if err != nil {
        fmt.Println("env 오류")
    }

    TEMP_TOKEN := os.Getenv("TEMP_TOKEN")
    user, err := GetUserInfo(TEMP_TOKEN)
    isSavedID, err := IsSavedID(user, testDB)

    if err != nil {
        return
    }

    if !isSavedID {
        err := C_UserInfo(user, testDB)
        if err != nil {
        t.Fatal("생성 실패")
        }
    }
}


판단

GetUserInfo에서 받은 user의 값에 문제가 있다.

결과

원인 : user의 id 값이 DB int의 범위를 초과하여 저장에 문제가 발생

해결 : id의 type을 varchar를 이용


로그인 과정 수정

로그아웃을 구현하기 위해서 로그인 먼저 개선이 필요하다고 판단하여 로그인을 고민하였습니다.

Flow chart

기존의 문제점

Cookie에 사용자의 정보를 담고있어 Cookie를 수정할 수 있음

선택한 방법

Session을 활용하여 user의 정보를 저장하여 Cookie를 수정하게 되는 경우 Session의 값과 비교하여 이상 탐지


Session의 ID는 어떻게 정하는가?

참고한 사이트
https://velog.io/@tataki26/GO-Session-%EC%83%9D%EC%84%B1
위의 사이트에서 Cookie와 Session의 차이점과 로그인 로그아웃에 대한 예제를 확인

UUID
Univerally Unique Identifier의 약자로 범용 고유 식별자를 의미
golang에서 github.com/google/uuid, github.com/satori/go.uuid 등을 활용하여 UUID를 생성

ULID
UUID에 대하여 알아보던 중 ULID에 대하여 알게되었습니다.
Universally Unique Lexicographically Sortable Identifier의 약자로 생성 순서대로 정렬이 가능한 특징이 있습니다.

두 방법을 확인 후 golang을 활용한 session 생성 방법을 확인한 결과 gorila/session을 활용하여 cookie까지 생성하는 방법을 알게 되어 gorila/session을 사용하기로 결정


Session 저장 오류

문제점
session에 user정보를 저장하고 axios를 통하여 정보를 호출하려고 하였지만 session에 저장된 정보가 없어 오류가 발생

원인
axios로 요청 시 cookie를 담아 보내지 않아 session에서 값을 확인할 수 없던 문제

해결
withCredentials의 값을 true로 하여 cookie 전달

const result = await axios.get("http://localhost:8080/userinfo", {
    withCredentials: true,
});

로그아웃

cookie 정보를 전달하여 session을 초기화

await axios.get("http://localhost:8080/kakao/logout", {
    withCredentials: true,
});

응답이 오면 root URL로 이동하여 카카오 로그인 하지 않으면 서비스를 이용하지 못하게 막음


결과

profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!