Skip to content

Commit a35c8bd

Browse files
authored
Merge pull request #18 from BusanHackathon/refactor/#7-login-temp
refactor: 로그인 티켓 방식으로 변경
2 parents fa03da2 + d257d2a commit a35c8bd

3 files changed

Lines changed: 41 additions & 14 deletions

File tree

src/main/java/com/busan/config/security/oauth/OAuth2SuccessHandler.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.springframework.stereotype.Component;
1313

1414
import java.io.IOException;
15+
import java.util.UUID;
1516

1617
@Component
1718
@RequiredArgsConstructor
@@ -37,22 +38,13 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
3738
System.out.println("[OAuth2SuccessHandler] called for user: " + userDetails.getUsername());
3839

3940
String refreshToken = jwtService.generateRefreshToken(userDetails);
40-
ResponseCookie refreshCookie = createRefreshTokenCookie(refreshToken);
41+
String ticket = UUID.randomUUID().toString();
4142

42-
response.addHeader("Set-Cookie", refreshCookie.toString());
43+
// 임시 저장 (간단하게 static Map 사용)
44+
TempTokenStore.put(ticket, refreshToken);
4345

44-
String target = "dev".equalsIgnoreCase(appEnv) ? redirectDev : redirectLocal;
45-
response.sendRedirect(target);
46-
}
47-
48-
private ResponseCookie createRefreshTokenCookie(String refreshToken) {
49-
return ResponseCookie.from("refreshToken", refreshToken)
50-
.httpOnly(true)
51-
.secure(true)
52-
.sameSite("None")
53-
.path("/")
54-
.maxAge(60 * 60 * 24 * 7)
55-
.build();
46+
String base = "dev".equalsIgnoreCase(appEnv) ? redirectDev : redirectLocal;
47+
response.sendRedirect(base + "?ticket=" + ticket);
5648
}
5749
}
5850

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.busan.config.security.oauth;
2+
3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
6+
public class TempTokenStore {
7+
private static final Map<String, String> store = new ConcurrentHashMap<>();
8+
9+
public static void put(String ticket, String refreshToken) {
10+
store.put(ticket, refreshToken);
11+
}
12+
13+
public static String consume(String ticket) {
14+
return store.remove(ticket); // 한번 쓰면 바로 삭제
15+
}
16+
}

src/main/java/com/busan/controller/AuthController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.busan.controller;
22

3+
import com.busan.config.security.oauth.TempTokenStore;
34
import com.busan.dto.RefreshResponseDTO;
45
import com.busan.dto.common.Response;
56
import com.busan.service.AuthService;
@@ -9,6 +10,8 @@
910
import org.springframework.http.ResponseEntity;
1011
import org.springframework.web.bind.annotation.*;
1112

13+
import java.util.Map;
14+
1215
@Tag(name = "auth-controller", description = "로그인 API")
1316
@RestController
1417
@RequestMapping("/api/auth")
@@ -27,4 +30,20 @@ public ResponseEntity<Response<RefreshResponseDTO>> refresh(
2730
) {
2831
return ResponseEntity.ok(Response.success(authService.refresh(refreshToken)));
2932
}
33+
34+
@Operation(
35+
summary = "티켓 발급",
36+
description = "헤커톤을 위한 최소한의 보안절차로 프론트는 url에서 ticket을 추출하고 이걸로" +
37+
"refreshToken을 교환한다." +
38+
"그후 access 발급 api를 호출하면 된다" +
39+
"물론 추후에는 당연히 쿠키방식으로 변경하는게 맞으나 헤커톤을 위한 최소한의 보안장치이다"
40+
)
41+
@GetMapping("/ticket")
42+
public ResponseEntity<?> consume(@RequestParam String ticket) {
43+
String refreshToken = TempTokenStore.consume(ticket);
44+
if (refreshToken == null) {
45+
return ResponseEntity.badRequest().body("invalid ticket");
46+
}
47+
return ResponseEntity.ok(Map.of("refreshToken", refreshToken));
48+
}
3049
}

0 commit comments

Comments
 (0)